18.
Кодирование отрицательных чисел (лекция 18)Числа с
фиксированной точкой и мантиссы чисел с
плавающей точкой могут участвовать в машинной
арифметике в одном из трех кодов: прямом,
дополнительном или обратном. Дадим определения
этих кодов для целых двоичных чисел. Общее число
разрядов, включая знаковый, будем обозначать
буквой n.
Нумерация, согласно общепринятому правилу,
начинается с нуля. Таким образом, разряд с весом будет являться знаковым. Для упрощения
записей будем пользоваться следующими
обозначениями:
|A|
-модуль числа A; -
-
Прямым кодом числа А называется запись
Прямой код совпадает с записью числа в определенной нами ранее естественной форме. Число -
1010 в прямом коде запишется как 11010. В этом коде нуль имеет два значения: + 0 = 0000.....0 и - 0 = 1000.....0.В этом коде можно складывать числа, имеющие одинаковые знаки. При этом знаковые цифры не складываются, как все остальные, знак суммы определяется отдельной логической операцией. Переносы в знаковый разряд не допускаются. Примеры сложения чисел в прямом коде:
Выделенные нами знаковые цифры результата получаются логически, т.е. результату присваивается тот же знак, что у слагаемых. Сложение знаковых цифр недопустимо, так как оно ведет к неправильному результату. Во втором примере получилось бы 1+1=10, единица переноса была бы потеряна, а в знаковом разряде остался бы нуль.
При вычитании или, что то же самое, при сложении чисел с противоположными знаками пришлось бы реализовать очень сложный алгоритм. Сперва каким-то путем устанавливать, какое из слагаемых имеет больший модуль (например, с помощью специальной комбинационной логической схемы) и запоминать его знак, затем из большего модуля вычитать меньший. Практически это никогда не делается, просто прямой код не используется для алгебраического сложения, то есть для сложения чисел с произвольными знаками.
Дополнительным кодом называется запись:
Член вне скобок - это единица знакового разряда, а внутри скобок находится дополнение модуля числа
A доРис. 18.1
Стрелки указывают направление увеличения модуля, скобки определяют, каким сегментам принадлежат граничные точки. Из рисунка видно, что в дополнительном коде, как и в прямом, для изображения отрицательных чисел выделен отрезок положительной числовой оси. Отличие состоит в том, что в дополнительном коде отсчет на этом отрезке
идет справа налево.Дополнение модуля числа до
Находить дополнение вычитанием в машинной арифметике нельзя, так как вычитание в обычном смысле этого слова вообще не используется. Машинный алгоритм основан на преобразовании:
Поразрядное вычитание двоичных цифр из единицы равносильно их инвертированию как логических переменных, что выполняется очень просто. Чтобы преобразовать прямой код отрицательного числа в дополнительный, нужно, не меняя знаковой цифры, проинвертировать цифры модуля и прибавить единицу. Для обратного перехода, казалось бы, требуются противоположные действия, т.е. сперва отнять единицу, а потом проинвертировать цифры дополнения. Однако точно такой же результат получается при повторном применении прямых действий: инверсия и плюс единица. Дело в том, что вычитать единицу из дополнения или прибавлять единицу к модулю - это равносильные операции.
В дополнительном коде нуль имеет только одно значение: “плюс нуль”. Попытаемся получить “минус нуль”
+1 = 111111+1 =
Выделенная рамочкой единица выходит из разрядной сетки и теряется. В пределах принятого формата числа остается код “плюс нуля”.
В дополнительном коде сложение и вычитание выполняются одинаково, как алгебраическое сложение чисел с произвольными знаками. При этом знак суммы получается арифметическим путем, благодаря распространению сложений и переносов на знаковый разряд. Рассмотрим сложение при разных сочетаниях знаков слагаемых В
, С и суммы А.1)
В > 0, С > 0. Этот вариант выполняется как в обычной арифметике и внешне - как в прямом коде, но знак суммы определяется сложением2)
В > 0, C < 0, |A| > |C|. Этот вариант равносилен вычитанию положительного С :Заключенная в рамку единица переноса из старшего разряда суммы теряется. Ее потеря не является ошибкой. Дополнительный код отрицательного числа по определению отличается от истинной величины числа на константу, равную
3)
В > 0, C < 0, |B| < |C|.4)
В < 0, C < 0. В этом варианте для формирования кода отрицательного числа требуется одна константаОбратным кодом
называется запись:Обратный код отличается от дополнительного отсутствием единицы, прибавляемой после инвертирования. Эту отсутствующую единицу иногда приходится прибавлять искусственно, чтобы скорректировать результат сложения. В обратном коде нуль имеет два значения: “плюс нуль” 0000....0 и “минус нуль” 1111...1. Сложим в обратном коде числа с разными сочетаниями знаков:
1)
В > 0, C > 0. Этот случай в любом коде выполняется одинаково.2)
В > 0, C < 0, |B| > |C|.Объясним причину необходимости так называемого “циклического переноса”. В коде отрицательного слагаемого недоставало единицы младшего разряда (по определению кода). Сумма получилась положительной, а здесь по определению прямого кода недостача единицы не предусмотрена. Следовательно, эту единицу следует прибавить искусственно. Признаком данной ситуации является перенос из старшего разряда суммы, который уносит константу, входившую в код отрицательного слагаемого. “Циклический перенос”, это - всего лишь мнемонический прием, означающий, что если при сложении обратных кодов произошел перенос из знакового разряда, то необходимо скорректировать сумму.
3)
В > 0, C < 0, |B| < |C|.4) B < 0, C < 0.
Правильные двоичные дроби в прямом, дополнительном и обратном кодах изображаются подобно целым числам, но в определении кодов используются другие константы:
В заключение этой темы запишем определения прямого, дополнительного и обратного кодов для целых чисел при произвольном основании системы счисления
q.
Обратим внимание на то, что здесь при формировании дополнительного и обратного кодов инвертирование цифр определяется как арифметическое дополнение до старшей цифры в данной системе.
Для правильных дробей определения прямого, дополнительного и обратного кодов описываются следующими выражениями: