Использование обратного кода дает еще одну возможность замены арифметического действия вычитания сложением с инверсией вычитаемого.
Кодирование чисел в обратном коде можно также получить естественным путем при помощи операции вычитания (при моделировании работы вычитающего счетчика).
Для примера рассмотрим работу двоичного счетчика при вычитании, начиная со значения 2(10):
0.010 + 2(10)
0.001 + 1(10)
0.000 + 0(10) ноль
1.111 это значение в обратном коде рассматривается как минус ноль (–0(10))
1.110 –1(10)
1.101 –2(10) и т.д.
В обратном коде определение кода отрицательной величины по коду положительной величины (приписывание отрицательного знака) производится по упрощенному правилу: каждую цифру числа (включая знак) меняют на противоположную. Так как во время счета при переходе счетчика через нулевое значение теряется одна единичка, для корректности вычислений в обратном коде требуется соответствующая компенсация. Для этой цели используется естественный перенос из старшего знакового разряда при переходе счетчика через нулевое значение.
Ниже представлены числа со знаком в обратном коде, которые можно поместить в трехразрядный регистр:
Положительные
Отрицательные
0.00(2)
+ 0(10)
1.00(2)
– 3
0.01(2)
+ 1(10)
1.01(2)
– 2
0.10(2)
+ 2(10)
1.10(2)
– 1
0.11(2)
+ 3(10)
1.11(2)
– 0
Двоичный обратный код полностью симметричен по отношению к множеству положительных и отрицательных чисел.
Примеры выполнения операции вычитания в обратном коде над числами
А=2(10)=0.10(2) и В=1(10)=0.01(2)
1. С=А–В=А+(–В)
0.10 +2(10)
+1.10 –1(10)
1½0.00 сложение
+ 1 коррекция, сложение с единицей переноса
0.01 результат 2(10)–1(10)=1(10).
2. С=В–А=В+(–А)
0.01 +1(10)
+1.01 –2(10)
1.10 результат 1(10)–2(10)=–1(10)
В примере (из меньшего вычитается большее) нет коррекции, но результат верен.
3. С=В–1–1=В+(–1)+(–1). Пример эквивалентен примеру 2, но вычитание двух единиц производится в два этапа.
0.01 +1(10)
+1.10 –1(10)
1.11 –0(10) результат первого вычитания
+1.10 –1(10)
1½1.01 результат второго вычитания без коррекции
+ 1 коррекция, сложение с единицей переноса
1.10 результат 1(10)–2(10)=–1(10).
В приведенных примерах коррекция результата (сложение с единицей переноса) представлена в виде отдельного действия, но на практике коррекция совмещается со сложением. Просто используется суммирующее устройство с циклическим переносом с выхода старшего разряда на вход переносов младшего разряда.
Таким образом, обратный код отличается от дополнительного алгоритмом определения кода отрицательной величины по коду положительной величины и использованием сумматора с циклическим переносом., а реализация арифметических действий в обратном коде предполагает использование сумматора с циклическим переносом.
Для выявления переполнения разрядной сетки применяется модифицированный обратный код.
Модифицированный обратный код, как и дополнительный, получается простым дублированием знакового разряда.
Дополнительный и обратный коды считаются равноценными, но в реальных ЭВМ применяется преимущественно дополнительный код. В ЭВМ числа со знаком могут храниться в памяти в прямом, обратном или в дополнительном кодах, но выполнение арифметических операций, связанных с вычитанием, производится с использованием дополнительного или обратного кодов.