Знак числа в дополнительном коде

В дополнительном коде числа, строго говоря, отсутствует отдельный разряд знака. То, что все отрицательные числа, представленные в дополнительном коде, имеют единицу в старшем разряде, а положительные числа -- имеют в старшем разряде ноль, является только свойством дополнительного кода. Не должно вводить в заблуждение и употребляемое определение старшего разряда как "знакового". На самом деле, знак и "абсолютная величина" в дополнительном коде связаны воедино и неразделимы.

Это понимание особенно важно при преобразовании числа со знаком, представленного, например, в одном байте (ShortInt) в двухбайтовый формат (Integer):

Исходное число ShortInt, равное минус 38 , представленное в одном байте:

Правильно преобразованное в двухбайтовый формат представление того же самого числа "минус 38" в двухбайтовом формате (Integer):

старший байт младший байт
                               

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

Перенос и переполнение

Как видно из проведённых выше примеров, в некоторых случаях операции над числами в дополнительном коде дают ошибочный результат. Эти случаи называются "переполнением". Название случая отражает то, что требуемый результат не может быть размещён в используемой разрядной сетке, или не входит в множество чисел со знаком данной разрядности.

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

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

  Получено Перенос в знаковый разряд Перенос за пределы разрядной сетки Переполнение
"ноль"+"ноль"="ноль" 00+00=00 - - -
"ноль"+"один"="один" 00+01=01 - - -
"ноль"+"минус один"="минус один" 00+11=11 - - -
"ноль"+"минус два"="минус два" 00+10=10 - - -
"один"+"один"="два" 01+01=10 + - !
"один"+"минус один"="ноль" 01+11=100 + + -
"один"+"минус два"="минус один" 01+10=11 - - -
"минус один"+"минус один"="минус два" 11+11=110 + + -
"минус один"+"минус два"="минус три" 11+10=101 - + !
"минус два"+"минус два"="минус четыре" 10+10=100 - + !

Обозначая С -- логическое значение высказывания "Произошёл перенос за разрядную сетку", а

С3 -- логическое значение высказывания "Произошёл перенос в знаковый разряд"

, можно выразить логическое значение Ov высказывания "Произошло переполнение" следующей формулой:

Ov=(C&С3)|С&С3)=C][С3 ,

где обозначено: & -- операция "И", | -- операция "ИЛИ", ][ -- операция "Исключающее ИЛИ", черта сверху -- операция "НЕ".

Наши рекомендации