Прямой, обратный и дополнительный коды
При вычислении ЭВМ оперируют как с положительными, так и с отрица-
тельными числами. При этом вычитание можно заменить сложением, восполь- зовавшись дополнением отрицательного числа. Дополнением числа 12510 будет
число *7510, числа 12516 будет число ЕDВ16, для числа 11012 - число 112. Эти
дополнения получают следующим образом:
_1*0010 _100016 _10000*
12510 12516 1*01*
87510 EDB16 112
Так как в ЭВМ имеются только устройства, выполняющие сложение, то
вычитание заменяется сложением специальных кодов чисел. Для выполнения операций с двоичными числами в ЭВМ используются прямой, обратный, до- полнительный, модифицированные обратный и дополнительный коды. Изо-
бражение положительных чисел во всех кодах одинаково, а отрицательных -
различно.
Прямой код совпадает с записью самого числа. В знаковом разряде за-
писывается 0 (знак +) или 1 (знак -), а затем записывается само число.
Например, числа: А1=+*,10*0 и А2= - *,10*0 в прямом коде записываются в
виде: [А1]пр=0 1010 и [А2]пр=1 1*10.
Пример: В* = +0,1*1001 [В*]пр.= 0 *0*001;
В2 = - 0,*1101 [В2]пр.= 1 *1101.
Обратный код отрицательного числа получается следующим обра-
зом: в знаковом разряде записывается единица, а в цифровых разрядах нули
заменяются единицами, а единицы - нулями.
Например, числа А1=+0,1010 и А2= - 0,101* в обратном коде записываются в
виде [А1]обр.=0 101* и [А2]обр.=1 0101.
Пример: В1 = +0,101100 [В1]обр.= 0 101110;
В2 = - 0,010101 [В2]обр.= 1 1*1*1*.
Дополнительный код отрицательного числа получается добавлением
единицы к младшему разряду обратного кода этого числа.
Например: числа А1=+0,1010 и А2= - 0,101* в дополнительном коде записыва-
ются в виде: [А1]доп.=* 101* и [А*]доп.=1 0*10.
Пример: В1 = +0,00110 [В1]доп.= 0 0*110;
В2 = - 0,00*101 [В2]доп.= 1 110011.
Модифицированный код отличается тем, что на изображение знака
числа в нем отводится два разряда, что дает возможность выявить перепол-
нение разрядной сетки.
Например, для числа А= - 0,101* получим [А]мобр.=11 *101, [А]мдоп.=11 0110.
Переход от обратного и дополнительного кодов к прямому осуществляется
аналогично переходу от прямого кода к обратному и дополнительному.
При сложении и вычитании чисел в обратном коде единица переноса, вы-
шедшая за пределы знакового разряда, не отбрасывается, а прибавляется к
младшему разряду результата, что осуществляется автоматически.
Например, в обратном коде операции алгебраического сложения выполня-
ются следующим образом:
1) а=0,10*0>0 [а]обр.=0 1010
b=0,0010>0 [в]обр.=0 0010
[х]обр.=0 1100
х= 0,1100
2) а= - *,1010<0
b= 0,1100>0
3) а=0,*010>*
b= - 0,0010<0
*) a= - 0,1010<0
b= - 0,0010<0
[а]обр.=1 0101
[в]обр.=0 1100
10 0001
[х]обр.=0 001*
х= 0,0010
[а]обр.= 0 1010
[в]обр.= * 1101
10 011*
[х]обр.= 0 100*
х= 0,1000
[a]обр.=1 0101 [b]обр.=* 1101
11 00*0
[*]обр.=* 0011
*= - 0,1100
Сложение и вычитание двоичных чисел в дополнительном коде происхо-
дит поразрядно, включая и знаковые разряды. Единица переноса, вышедшая за
пределы знакового разряда, отбрасывается.
Пример:
*= - 0,*01*<0 b= - 0,0010<0
[a]доп.=1 0110 [b]доп.=1 1*10
11 01*0
[х]доп.=1 010* [х]обр.=1 *0*1
х= - *,1100
Например, имеется число А1 = 0,10*112 и А2 = 0,01*2. Нужно выполнить
действие А1-А2
_0,10111
0,01*00
0,01011
Заменим операцию вычитания сложением. Для этого произведём кодирование:
получим обратный и дополнительный коды для чисел А1 и А2.
[A*]обр.= * 10111 [A2]обр.= * 1001*
[A*]доп.= 0 *0*1* [*2]доп.= 1 1*100
Выполним операцию сложения полученных кодов
+ [A1]обр.= * 10111
[A*]обр.= 1 10011
10 010*0
[A1+A*]обр.= 0 01011
A1+A2 = 0,0101*
+[A1]доп.= 0 1011*
[A2]доп.= * 1010*
10 *1*11
[A*+A2]доп.= 0 01011
*1+A2 = *,0101*