В дополнительном коде числа, строго говоря, отсутствует отдельный разряд знака. То, что все отрицательные числа, представленные в дополнительном коде, имеют единицу в старшем разряде, а положительные числа -- имеют в старшем разряде ноль, является только свойством дополнительного кода. Не должно вводить в заблуждение и употребляемое определение старшего разряда как "знакового". На самом деле, знак и "абсолютная величина" в дополнительном коде связаны воедино и неразделимы.
Это понимание особенно важно при преобразовании числа со знаком, представленного, например, в одном байте (ShortInt) в двухбайтовый формат (Integer):
Исходное число ShortInt, равное минус 38, представленное в одном байте:
Правильно преобразованное в двухбайтовый формат представление того же самого числа "минус 38" в двухбайтовом формате (Integer):
старший байт | младший байт | ||||||||||||||
То есть, правильным действием при увеличении разрядности слова, в которое записывается число в дополнительном коде является "распространение знака" на добавившиеся разряды.
Перенос и переполнение
Как видно из проведённых выше примеров, в некоторых случаях операции над числами в дополнительном коде дают ошибочный результат. Эти случаи называются "переполнением". Название случая отражает то, что требуемый результат не может быть размещён в используемой разрядной сетке, или не входит в множество чисел со знаком данной разрядности.
При сложении чисел в дополнительном коде почти в половине случаев возникает перенос за разрядную сетку, причём результат сложения оказывается правильным. Переносом за разрядную сетку называют случай, при котором результат сложения не помещается в разрядную сетку слова (в примере -- двухразрядную). Эти случаи при операциях с числами в дополнительном коде, вообще говоря, не приводят к ошибочному результату. Более того, на игнорировании переноса за разрядную сетку основаны замечательные свойства дополнительного кода.
При подробном рассмотрении таблицы сложения двухразрядных чисел можно отметить, что ошибочный результат происходит в случаях, когда имеет место перенос за разрядную сетку, а переноса в старший (знаковый) разряд в процессе операции не происходит. И наоборот, при сложении происходит перенос в старший (знаковый) разряд, а переноса за разрядную сетку не происходит.
Получено | Перенос в знаковый разряд | Перенос за пределы разрядной сетки | Переполнение | |
"ноль"+"ноль"="ноль" | 00+00=00 | - | - | - |
"ноль"+"один"="один" | 00+01=01 | - | - | - |
"ноль"+"минус один"="минус один" | 00+11=11 | - | - | - |
"ноль"+"минус два"="минус два" | 00+10=10 | - | - | - |
"один"+"один"="два" | 01+01= 1 0 | + | - | ! |
"один"+"минус один"="ноль" | 01+11=1 0 0 | + | + | - |
"один"+"минус два"="минус один" | 01+10=11 | - | - | - |
"минус один"+"минус один"="минус два" | 11+11=1 1 0 | + | + | - |
"минус один"+"минус два"="минус три" | 11+10=101 | - | + | ! |
"минус два"+"минус два"="минус четыре" | 10+10=100 | - | + | ! |
Обозначая С -- логическое значение высказывания "Произошёл перенос за разрядную сетку", а
С3 -- логическое значение высказывания "Произошёл перенос в знаковый разряд"
, можно выразить логическое значение Ov высказывания "Произошло переполнение" следующей формулой:
Ov=(C&С3)|С&С3)=C][С3,
где обозначено: & -- операция "И", | -- операция "ИЛИ", ][ -- операция "Исключающее ИЛИ", черта сверху -- операция "НЕ".