yandex rtb 1
ГоловнаЗворотній зв'язок
yande share
Главная->Різні конспекти лекцій->Содержание->2.8. Десятичная арифметика

Организация ЭВМ

2.8. Десятичная арифметика

Необходимый перевод для ЭВМ десятичных чисел в двоичные и обратно требует затраты времени и ресурсов. В цифровых устройствах, где основная часть операций связана не с обработкой и хранением информации, а с самим ее вводом и выводом на какие-либо устройства отображения с десятичным представлением полученных результатов, имеет смысл проводить вычисления в десятичной системе счисления. Но ЭВМ требует информацию только в двоичной форме. Следовательно, десятичные цифры нужно кодировать каким-либо легко реализуемым и быстрым способом. Для этих целей используется двоично-десятичный код, в котором каждая десятичная цифра 0...9 изображается соответствующим 4-разрядным числом (от 0000 до 1001). Такой код называется еще кодом 8421 (цифры, соответствующие весам двоичных разрядов).

 

Пример.

Представление десятичного числа в двоично-десятичном коде.

 

 

Две двоично-десятичные цифры составляют 1 байт, т.е. с помощью 1 байта можно представить десятичные числа от 0 до 99.

Действия над двоично-десятичными числами выполняются как над двоичными. Сложности возникают при переносе из тетрады в тетраду.

Кроме того, следует отметить, что выполнение сложения и вычитания двоично-десятичных чисел со знаком сводится к сложению или вычитанию модулей путем определения фактически выполняемой операции по знаку операндов и виду выполняемой операции. Например, требуется вычислить Z=X-Y при X<0 и Y<0. Тогда выполняется операция |Z|=|Y|-|X|, а затем знак |Z| изменяется на противоположный.

2.8.1. Сложение двоично-десятичных чисел

В операции сложения двоично-десятичных чисел участвуют только модули чисел. Поскольку код одноразрядных двоично-десятичных чисел полностью совпадает с их двоичным кодом, никаких проблем при выполнении операции сложения не возникает. Однако многоразрядные двоично-десятичные числа не совпадают с двоичными, поэтому при использовании двоичной арифметики получается результат, в который надо вводить коррекцию. Рассмотрим это подробнее.

Уже отмечалось, что каждая цифра десятичного числа может быть представлена кодом от 0000 до 1001, поэтому если при сложении разряда j двоично-десятичного числа результат меньше, либо равен 9, то коррекции не требуется, так как двоично-десятичный код результата полностью совпадает с его двоичным кодом.

 

Пример.

Zj=Xj+Yj = 3(10)+5(10), где j – номер разряда десятичного числа

 

 

Если при сложении j-разрядов чисел результат Zj будет больше или равен 10, то требуется коррекция результата. Рассмотрим, как машина может идентифицировать эту ситуацию. Существуют два варианта.

 

Вариант 1.                 Zj=10...15 = (1010...1111)

Здесь требуется коррекция, т.е. перенос 1 в старший (j+1) десятичный разряд. Необходимость коррекции в этом случае ЭВМ узнает по чисто формальным признакам:

Эту ситуацию можно описать логическим выражением:

 

Пример.

Zj=Xj+Yj = 5(10)+7(10) , где j – номер разряда десятичного числа.

 

Перенос из разряда j означает в десятичной системе счисления, что . В то же время в двоичной системе счисления перенос 1 из младшей тетрады в старшую означает, что . Следовательно, при коррекции имеет место соотношение

 

Zjкор = Zj - 10(10) + 16(10) = Zj + 6(10).

 

Тогда в рассмотренном выше примере

 

 

Вариант 2.                 Zj=16,17,18 = (8+8, 8+9, 9+9)

В этом случае из младшей тетрады в старшую происходит перенос 1 или 16(10). Но в десятичной системе счисления переносится в старший разряд только 10. Следовательно, для компенсации в младший разряд следует прибавить 6.

 

Пример.

Zj=Xj+Yj = 8(10)+9(10) = 17(10), где j – номер разряда десятичного числа.

 

Таким образом, можно сформулировать правило, по которому следует осуществлять коррекцию каждого десятичного разряда результата:

если при сложении многоразрядных двоично-десятичных чисел возник перенос из разряда или f=1, то этот разряд требует коррекции (прибавления 6(10)). При этом корректируются все тетрады последовательно, начиная с младшей.

Пример.

Z = X + Y = 927 + 382 = 1309.

 

 

При практической реализации двоично-десятичной арифметики поступают несколько по-другому.

 

Алгоритм выполнения операции состоит в следующем:

1.   Одно из слагаемых представляется в коде с избытком 6, т.е. к каждой тетраде двоично-десятичного числа добавляется число 0110. Избыток не обязательно добавлять к одному из слагаемых. Его можно добавить к результату сложения обоих модулей.

2.   Сложение двоично-десятичных модулей выполняется по правилам двоичной арифметики.

3.   Если при сложении тетрад получается результат Zj больше или равный 10, то автоматически вырабатывается перенос в следующий разряд (тетраду), поскольку фактически Zj³16. В этом случае результат в данной тетраде получается в естественном двоично-десятичном коде 8421 и коррекции не требуется. Однако, если избыток добавлять к результату сложения модулей, а не к одному из слагаемых, то при выяснении необходимости коррекции следует учитывать переносы как при сложении модулей, так и при добавлении избытка.

4.   Если при сложении в каких-либо тетрадах переносы отсутствуют, то для получения правильного результата из кодов этих тетрад необходимо вычесть избыток 6. Это можно сделать двумя способами:

·      просто вычесть число 0110(2) = 6(10);

·      сложить с дополнением до 16(10) , т.е. с числом 10(10) = 1010(2).

Возникшие при этом межтетрадные переносы не учитываются.

На практике реализуют второй способ.

 

Пример.

Z = X + Y = 132 + 57 = 189.

 

 

Перед сложением операнды выравниваются по крайней правой тетраде. Теперь надо к Z’ добавить избыток (6(10)):

 

 

 

Такой же результат получится, если с избытком +6 взять один из операндов (X или Y). Тогда к результату избыток прибавлять не нужно.

В данном примере при вычислении Z6’ не было переносов из каких-либо тетрад, поэтому необходима коррекция каждой тетрады суммы Z6’. Коррекция производится путем прибавления к каждой тетраде числа 10(10)= 1010(2):

 

 

Пример.

Z = X + Y = -93(10) - 48(10) = -(93+48)(10) = -141(10).

 

 

Перед сложением операнды выравниваются по крайней правой тетраде. После этого к Z необходимо добавить избыток (6(10)):

 

 

Такой же результат получится, если с избытком +6 взять один из операндов (X или Y). Тогда к результату избыток прибавлять нет необходимости. В данном примере из двух тетрад переносы существуют, поэтому необходима коррекция только старшей тетрады (из нее нет переноса):

 

 

Пример.

Z = X + Y = 99(10) + 99(10) = 198(10).

 

 

При сложении модулей возникли переносы. Добавим избыток:

 

При добавлении избытка 6 переносов не было, однако они имели место при сложении модулей. Их следует учитывать при оценке необходимости коррекции, поэтому, в данном случае, коррекция требуется только для старшей тетрады:

 

2.8.2. Вычитание модулей двоично-десятичных чисел

По аналогии с операциями вычитания в двоичном коде операцию X-Y можно представить как X + (-Y). При этом отрицательное число представляется в дополнительном коде, аналогичном дополнительному коду в двоичной арифметике. Этот код используется только для выполнения операций вычитания. Хранятся двоично-десятичные числа (как положительные, так и отрицательные) в прямом коде со знаком.

 

Алгоритм выполнения операции состоит в следующем:

1.   Модуль положительного числа представляется в прямом двоично-десятичном коде (8421).

Модуль отрицательного числа – в дополнительном коде (ДК) с избытком 6.

Для получения ДК необходимо:

- инвертировать значения разрядов всех тетрад числа;

- к младшему разряду младшей тетрады прибавить 1.

Таким образом, цепочка ПК (mod) ® ОК ® ОК+1 ® ДК аналогична цепочке в двоичной арифметике. Только здесь получается ДК с избытком 6, так как дополнение идет не до 10, а до 16.

2.   Произвести сложение операндов (X) в ПК и (Y) в ДК.

3.   Если при сложении тетрад возник перенос из старшей тетрады, то он отбрасывается, а результату присваивается знак "+", т.е. результат получается в прямом избыточном коде. Он корректируется по тем же правилам, что и при сложении модулей.

4.   Если при сложении тетрад не возникает переноса из старшей тетрады, то результату присваивается знак "-", т.е. результат получается в избыточном ДК. В этом случае необходимо перейти к избыточному ПК (т.е. инвертировать все двоичные разряды двоично-десятичного числа и прибавить к младшему разряду 1).

5.   Полученный в этом случае результат в ПК корректируется. Для этого к тем тетрадам, из которых возникал перенос при выполнении пункта 2 (при суммировании), необходимо добавить 10(10) или 1010(2). Возникшие при этом межтетрадные переносы не учитываются. Таким образом, корректировка происходит в тех тетрадах, которые в положительных числах не корректируются. Следует отметить, что при выполнении операции вычитания большего числа из меньшего (X - Y = Z, при |X|£|Y|), т.е. при Z£0 алгоритм коррекции результата после перевода Z из ДК в ПК требует уточнения. А именно, после перевода Z в ПК необходимость коррекции определяется не только приведенными правилами, но и следующими требованиями:

а) нулевой результат не корректируется;

б) значащие нули справа в результате не корректируются;

в) если Z¹0 и в нем отсутствуют значащие нули справа (т.е. пп. а, б не имеют места), необходимо анализировать Y. Если в Y есть значащие нули справа, то соответствующие им разряды (тетрады) Z требуют обязательной коррекции, независимо от наличия переносов при сложении XПК и YДК.

 

Пример.

Z=X-Y=49(10) -238(10) =-189(10).

 

Представим |Y| в ДК с избытком 6:

 

 

Выполним сложение:

 

Отсутствие переноса из старшей тетрады является признаком того, что результат получился в ДК (т.е. отрицательный).

Перейдем к нескорректированному избыточному ПК:

 

Произведем коррекцию результата в соответствии с п. 5 алгоритма:

 

Поскольку ранее результат получался в ДК, т.е. отрицательный, необходимо добавить знак (-). Окончательный результат будет следующий:

 

Z= -(0001 1000 1001) = -189(10)

Пример.

Z=X-Y=143(10) -58(10) =85(10).

 

 

Представим |Y| в ДК с избытком 6:

 

Выполним сложение:

 

Наличие переноса из старшей тетрады указывает на то, что результат получился в ПК (т.е. положительный).

Произведем коррекцию результата в соответствии с п. 3 алгоритма:

 

2.8.3. Умножение модулей двоично-десятичных чисел

Операция умножения сводится к образованию и многократному сложению частичных двоично-десятичных произведений.

 

Алгоритм выполнения операции состоит в следующем:

1.   Сумма частичных произведений полагается равной нулю.

2.   Анализируется очередная тетрада множителя, и множимое прибавляется к сумме частичных произведений столько раз, какова цифра, определяемая этой тетрадой.

3.   Сумма частичных произведений сдвигается на одну тетраду, и повторяются действия, указанные в п. 2, пока все цифры (тетрады) множителя не будут обработаны. Направление сдвига зависит от того, какой вариант перемножения выбран – "старшие разряды вперед" или "младшие разряды вперед".

4.   Каждая операция суммирования завершается десятичной коррекцией, соответствующей случаю суммирования двоично-десятичных чисел без избытка 6 (т.е. необходимо добавить 0110 к тем тетрадам, из которых был перенос или в которых f=1).

 

Пример.

Z = X * Y = 25(10) * 13(10) = 325(10).

X = 25(10) = 0010 0101(2-10);             Y = 13(10) = 0001 0011(2-10).

Для решения примера выберем вариант перемножения "старшие разряды вперед". В соответствии с п. 1 алгоритма полагаем сумму частичных произведений P0=0. (Частичные произведения будем обозначать Pi).

 

Формирование второго частичного произведения - более длительная операция, поскольку вторая анализируемая тетрада содержит 3(10), поэтому каждая операция суммирования требует проверки необходимости коррекции. Вычислим P2, последовательно суммируя слагаемые, образующие P2:

 

 

Таким образом, второе частичное произведение, состоящее из трех слагаемых, имеет вид

P2 = 0111 0101.

 

Теперь можно вычислить сумму первого и второго частичного произведений, т.е. результат:

 

 

Окончательный результат: Z = 0011 0010 0101(2-10) = 325(10).

Следует отметить, что в данном случае при суммировании операндов не возникало переносов, поэтому коррекция осуществлялась только по признаку f=1.

2.8.4. Деление модулей двоично-десятичных чисел

Операция деления выполняется путем многократного вычитания, сдвига и анализа результата подобно тому, как это делается при обычном делении. В настоящем курсе эта операция не рассматривается. Информация о ней может быть найдена в литературе, приведенной в конце главы.

 

16