Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика учебное пособие часть 1.doc
Скачиваний:
67
Добавлен:
16.09.2019
Размер:
882.18 Кб
Скачать

5.5.2 Кодирование в компьютере целых чисел со знаком

Кодирование целых чисел, имеющих знак, можно осуществить двумя способами. В первом варианте один (старший) разряд в машинном слове отводится для записи знака числа; при этом условились кодировать знак «+»  нулем, «»  единицей.

Под запись самого числа остается (k-1) двоичных разрядов, что обеспечивает наибольшее значение числа Zmax = 2k-1. Например, для k=16, Zmax = 215 – 1 = 3276710.

Такое представление чисел называется прямым кодом.

Например,  36(10) = 10010100 (знаковый разряд выделен),

+ 36(10) = 00010100 .

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

Альтернативным вариантом является представление чисел со знаком в дополнительном коде (ДК). Его применение позволяет заменить вычитание чисел их суммированием в дополнительных кодах.

Как строится дополнительный код?

Дополнением (D) k–разрядного целого числа Z(р) в системе счисления с основанием р называется величина D(Zp, k) = рk – Z.

Данную формулу можно представить в ином виде:

D(Zp, k) = ( (рk 1) – Z) + 1. Число (рk 1) состоит из k наибольших в данной системе счисления цифр (р1), например, 999(10) , FFF(16) или 11111(2).

Поэтому дополнение числа Z может быть получено путем дополнения до (р  1) каждой цифры числа Z и последующим прибавлением к последнему разряду 1.

Например, дополнение числа 278(10) D(278(10), 3) = 7 2 1 + 1 = 722.

(дополнение 2 до 9 – 7, 7 до 9 – 2, 8 до 9 – 1).

!!! Важным свойством дополнения является то, что его сумма с исходным числом в заданной разрядной сетке будет равна 0.

В рассматриваемом примере

278 + 722 = 1 000 (выделенную 1 отбрасываем, она не входит в отведенную разрядную сетку k=3).

Так как в двоичной системе счисления дополнением 1 является 0, а дополнением 0 является 1, то построение D(Z2, k) сводится к инверсии данного числа (т.е. замене нулей единицами, и единиц нулями), и прибавлению 1 к последнему разряду.

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

п ервый разряд кодирует знак: знаку «+» соответствует 0, знаку «–» 1;

для Zp  0 ДК совпадает с самим числом ДК = Zp;

для Zp < 0 ДК совпадает с дополнением модуля числа, то есть, ДК = D(|Zp|).

Пример 9. Построить дополнительные коды заданных чисел. (Код знака отделен от кода числа).

1235(10) ДК = 0 1235 8632(16) ДК = 0 8632

 1235(10) ДК = 1 8765  8632(16) ДК = 1 79CЕ

 5790(10) ДК = 1 4210 10211(3) ДК = 0 10211

 3204(5) ДК = 1 1241  10211(3) ДК = 1 12012

Пример 10. Построить дополнительный код чисел в двоичной системе.

 10110111(2) ДК = 1 01001001.

 11001101(2) ДК = 1 00110011.

Пример 10 позволяет сформулировать правило «механического» перевода в ДК отрицательных двоичных чисел: находим крайнюю правую 1, ее оставляем, а все цифры перед ней – инвертируем.

Так, для числа  1110001101(2) ДК = 1 0001110011.

При использовании дополнительных кодов операция вычитания двух чисел как самостоятельная отсутствует – она заменяется сложением первого числа с дополнительным кодом второго, то есть просто сложением двух ячеек памяти. При этом знаковый разряд участвует в операциях по правилам двоичного сложения (см. в следующей главе).

Перевод в дополнительный код производится автоматически при вводе чисел; в таком виде числа хранятся в ОЗУ и затем участвуют в операциях. При этом операция вычитания отрицательного числа автоматически переводит число в прямой код и вместо вычитания производится сложение.

На следующем примере рассмотрим еще одну интересную особенность двоичных дополнительных кодов.

Чему соответствует код 10000000? Отрицательного нуля не бывает! Поэтому этот код является дополнительным кодом числа «–128». Именно поэтому нижняя граница диапазона возможных значений для целых чисел со знаком всегда по модулю больше на 1 верхней границы диапазона.

Так, для языка Pascal диапазоны возможных значений для соответствующих типов следующие:

Shortint (целый, 1 байт со знаком) – [ 128; + 127];

Integer (целый, 2 байта со знаком ) – [  32768; 32767].

Приведенные особенности типов данных необходимо учитывать при программировании, чтобы избежать ситуаций, подобных приведенной в следующем примере.

Пример 11. Фрагмент программы:

L : integer; /* диапазон ( 32768  32767)

k: byte; /* диапазон (0  255)

…………….

L: =  300; /* ДК 11111110 11010100

k: = L; /* k присваивается младший байт, что при переводе в десятичную систему дает k = 11010100(2) = + 212(10)

L: = +300; /* ДК 00000001 00101100

k: = L; /* в результате k = +44(10) .