Для выполнения арифметических операций над двоичными числами в ЭВМ могут использоваться прямой, обратный или дополнительный код. Прямой код Хпр числа Х = хm xm-1... x0x-1x-n с учетом знака S можно определить из выражения
[Х]пр = S.½X½.
Если в ЭВМ модуль числа представлен с фиксированной запятой, то Хпр или целое, или дробное. Так, число Х = 1101101,11 в прямом коде может иметь два вида: как целое или дробное (с масштабным коэффициентом ×2+7) в разрядной сетке 1 байт 0.1101101 или 1.1101101 (число отрицательное). В зависимости от масштабного коэффициента и разрядности сетки часть разрядов мантиссы любого числа может теряться. Нуль в прямом коде допускается двух видов: 0.0...0 или 1.0...0. В прямом коде легко выполнять операции ввода чисел, умножения и сложения с одинаковыми знаками слагаемых. Однако операции вычитание и деление без изменения схемы сумматора проще реализуются с использованием обратных [Х]0 или дополнительных [X]Д кодов. Обратный и дополнительный коды можно получить по формулам
пр
пр
и ,
где m и n -номера позиций старшего и младшего разряда. В зависимости от положения запятой, если числа целые, то n = 0, а если дробные, то m = 0.
Из формул получения [Х]0 и [Х]Д видно, что прямой, обратный и дополнительный коды положительного числа совпадают. Обратный код отрицательного числа можно получить путем инверсии разрядов мантиссы
так как равенство подтверждается сложением
.
Отсюда справедливо также равенство
пр
.
Если к обратному коду отрицательного числа прибавить единицу в младший разряд (+2-n), получим дополнительный код
Д
.
Справедливо также равенство
Д
Д
пр
.
Представим числа Х1 = +125(10), Х2 = -5,5(10) с фиксированной запятой после младшего разряда в разрядной сетке 1 байт в двоичной СС в прямом, обратном и дополнительном кодах:
Д
пр
;
пр
.
Д
.
Сложим числа Х1 иХ2 в 2СС с фиксированной запятой в прямом (а), обратном (б) и дополнительном (в) кодах:
а)
+
.1111101
б)
+
0.1111101
в)
+
0.1111101
.0000101
1.1111010
1.1111011
¬
.0000010
0.1110111
¬
0.1111000
0.1111000
Из примеров сложения видно, что при сложении чисел в прямом, обратном и дополнительном коде результат получается в этих кодах. В прямом коде числа складываются без знака (в примере +125+5), если знаки разные, то операция не выполняется, наличие переноса в знаковый разряд (пример (а)) указывает на переполнение разрядной сетки. В обратном и дополнительном кодах числа складываются со знаками. Перенос из знакового разряда в дополнительном коде отбрасывается, а в обратном коде распространяется в сторону младшего разряда (цепь циклического переноса).
Недостатком обратного кода является двоякое представление нуля 0.0... 0 и 1.1... 1, а также увеличение времени сложения за счет распространения циклического переноса. В дополнительном коде нуль представлен только 0.0... 0, отсутствует циклический перенос и корректировка результата сложения заключается в простом отбрасывании переноса из знакового разряда. Однако для получения дополнительного кода отрицательного числа требуется не только инвертирование разрядов числа, которое заменяется в АЛУ передачей с обратных выходов триггеров регистра, но и прибавление единицы к младшему разряду в сумматоре. Недостатком сложения в обратном и дополнительном кодах является трудность определения переполнения разрядной сетки (ПП), которое определяется вычислением функции
ПП,
где x3,y3,z3 - знаки слагаемых и результата соответственно. Знаки слагаемых x3,y3 могут стираться после выполнения операции в одно- или двухадресных командах. Для устранения этого недостатка при сложении чисел с одинаковыми знаками могут использоваться модифицированные обратный и дополнительный коды. В них для представления числа используют два одинаковых знаковых разряда 00.(+) или 11.(-). Если после сложения по тем же правилам в знаковых разрядах окажется 00. или 11., то результат правильный, соответственно, положительный или отрицательный, а если 10. или 01., то необходимо фиксировать переполнение разрядной сетки. Эти результаты при сложении в модифицированномдополнительном коде можно пояснить примерами
00.111110
11.110011
00.000111
00.100010
01.000101
(ПП)
¬
00.010101
(нет ПП).
Заметим, что при сложении чисел в обратном и дополнительном кодах с разными знаками переполнения не происходит.