Кодирование целых чисел, имеющих знак, можно осуществить двумя способами.
Первый способ – называется прямым кодом. При этом один (старший) разряд в машинном слове (напомним, здесь машинное слово – 16 разрядов) отводится для записи знака числа; при этом условились кодировать знак «+» нулем, а знак «-» единицей. Под запись самого числа, очевидно, остается 15 двоичных разрядов, что обеспечивает наибольшее значение числа . Однако прямое кодирование усложняет вычисления. Например, операция сложения двух чисел с разными знаками должна быть заменена операцией вычитания меньшего из большего с последующим присвоением результату знака большего по модулю числа. Таким образом, такая операция сопровождается рядом проверок условий и выработкой признаков, в соответствии с которыми выбирается то или иное действие.
Второй способ - кодирования целых чисел со знаком называется дополнительным кодированием. Идея построения дополнительного кода такова: на оси целых чисел ( – всего 65536 чисел), помещающихся в машинное слово (в 16 разрядов) сместим положение нуля к середине интервала. При этом числа из первой половины () интервала будем считать положительными, а числа из второй половины () будем считать отрицательными. Судить о знаке числа можно по его величине, и в явном виде выделение знака не требуется. Оказывается, что принадлежность кода к интервалу кодов положительных или отрицательных чисел также видна по состоянию старшего бита – у кодов положительных чисел его значение «0», а у кодов отрицательных – «1». Это напоминает представление чисел с помощью прямого кода, но принцип построения дополнительного кода другой. Применение дополнительного кода позволяет заменить вычитание чисел их суммированием в дополнительном коде.
|
|
Рассмотрим вычитание числа , что эквивалентно прибавлению .
При наличии k разрядов можно закодировать чисел в P -ичной системе счисления. При этом максимальное k -разрядное P -ичное число есть , а число (оно содержит разрядов) можно считать нулем, так как первые слева (младшие) k разрядов (битов) в числе нулевые, а старший, единичный бит в нем уже не входит в отведенную разрядную сетку. Таким образом, можно записать:
. (12.5)
Однако вычесть из будет удобнее, если (12.5) преобразовать:
, (12.6)
причем число есть максимальное P -ичное k -разрядное число , каждая его цифра равна :
, (12.7)
, (12.8)
Цифры числа Zобозначим :
. (12.9)
Таким образом, с учетом (12.8) и (12.9), выражение (12.7) легко преобразуется:
. (12.10)
Величина (12.10) называется дополнением целого k-разрядного числа Z в системе счисления P.
Пример. ;
.
Важным свойством дополнения является то, что его сумма с исходным числом в заданной разрядной сетке равна нулю, то есть
|
|
. (12.11)
Пример. ;
.
В этом примере единица в скобках должна быть отброшена, так как она выходит за отведенную разрядную сетку.
Из (12.11) логично заключить, что
, (12.12)
значит, при имеем
. (12.13)
Поэтому дополнительный код (DС) двоичных чисел в компьютере надо строить согласно следующему правилу:
- для дополнительный код совпадает с самим числом, то есть ;
- для дополнительный код совпадает с дополнением модуля числа, то есть .
Пример. Построить дополнительный двоичный код числа .
;
Пример. Построить дополнительный двоичный код числа .
.
Кстати, используя результаты этих примеров, легко убедиться, что
.
Прямые и дополнительные коды целых чисел со знаком сопоставлены в табл. 19.
В компьютере используется интервал целых чисел со знаком, закодированных дополнительным двоичным кодом. Именно таким является диапазон значений чисел типа Integer в языке PASCAL.
В компьютере перевод в дополнительный код осуществляется автоматически при вводе чисел. Именно в таком виде числа хранятся в ОЗУ и участвуют в арифметических операциях.
Если результат отрицательный, то прямой код модуля числа получают из дополнительного кода в обратном изложенному порядке: -я цифра числа равна разности значения P и -й цифры числа .