Обратные коды
Обратные коды нигде, как правило, не используются в качестве самостоятельного способа изображения относительных чисел. Однако в тех случаях, когда в качестве основного способа используется прямой код, при выполнении сложения и вычитания часто вместо перехода к дополнительным кодам производится переход к обратным кодам.
Обратные коды отличаются от дополнительных тем, что при записи отрицательных чисел основные разряды содержат вместо дополнения от абсолютной величины числа до d0 дополнение от абсолютной величины числа до d0(1 – В -m), где d0 – вес добавочного двоичного разряда; В – основание системы счисления; т – количество основных (В-ичных) разрядов.
Относительно содержимого добавочного (знакового) разряда возможны, как и для дополнительных кодов, различные условия.
Можно, например, условиться (по аналогии с первым вариантом построения дополнительных кодов), что для положительных чисел добавочный разряд содержит «0», для отрицательных – цифру «1». При этом следует считать, что все основные разряды имеют естественные веса, а вес добавочного (знакового) разряда равен [– d0(1 – В –m)], а не (–d0), как в дополнительных кодах; числа записаны позиционным способом, но с искусственным весом для старшего разряда.
Если по аналогии со вторым вариантом построения дополнительных кодов договориться, что для положительных чисел знаковый разряд содержит цифру «1», а для отрицательных «0», то это эквивалентно условию, что все основные разряды имеют естественные веса, знаковый разряд имеет вес [+d0(1 – В -m)], а все числа увеличены на [+d0(1 – В –m)], т.е. величина
[–d0(1–В -m)] является аддитивной поправкой ко всем числам. Второй вариант, строго говоря, не является позиционным способом изображения чисел.
Вернемся к примерам 1.16 и 1.17. Положительные числа в дополнительном и в обратном кодах (а по существу, и в прямом коде) записываются одинаково. Если дополнительные коды строятся по первому варианту и обратные коды построены аналогично, то в разрядной сетке примера 1.16 положительное число +0,537 записывается в виде
в прямом коде......+.537;
в дополнительном и обратном коде..... 0.537.
Курсивом выделен двоичный (знаковый) разряд. Для отрицательных чисел разница более существенна. В той же разрядной сетке отрицательное число –0,537 имеет вид
в прямом коде.......–.537;
в дополнительном коде.....1.463;
в обратном коде......1.462.
В обратном коде вес добавочного двоичного разряда равен здесь
–d0(1– В -m) = –1.(1– 0,001) = 0,999; поэтому представленное указанным способом число действительно равно
1×(–0.999) + 4×1/10 + 6×1/100 + 2×1/1000 = –0,537
Нуль в обратном коде может записываться двояко. В разрядной сетке примера 1.16 он либо имеет вид 0.000
[здесь 0× (-0,999) +0×1/10 +0×1/100 +0×1/1000],
либо может быть записан в виде 1.999
[здесь 1× (–0,999) + 9×1/10 + 9×1/100 + 9×1/1000 = 0]. Наибольшее по абсолютной величине отрицательное число в этой разрядной сетке при использовании обратного кода есть число –0,999; оно записывается в виде 1.000; наименьшее по абсолютной величине отрицательное число, равное –0,001, имеет вид 1.998.
Аналогичным образом в разрядной сетке примера 1.17 положительное число +11/16 записывается в виде
в прямом коде...........+.1011;
в дополнительном и обратном коде ......0.1011;
отрицательное число –11/16 имеет вид
в прямом коде........–.1011;
в дополнительном коде........ 1.0101;
в обратном коде........... 1.0100;
вес добавочного разряда в данном случае равен –1×(1 – 11/16) = –15/16 (в двоичной системе –0,1111); нуль в обратном коде может быть записан либо в виде 0.0000, либо в виде 1.1111.
Как и при использовании дополнительных кодов, в обратных кодах можно применять и к положительным, и к отрицательным числам те правила счета, которые были сформулированы для позиционного способа изображения чисел с естественными весами разрядов. Однако при переходе через нуль правила счета усложняются.
Например, в разрядной сетке примера 1.16 наименьшее по абсолютной величине отрицательное число, как указывалось, записывается в виде 1.998. Применяя один раз правило прямого счета, найдем изображение ближайшего большего числа: 1.999. Как и следовало ожидать, получили изображение нуля (в одной из двух возможных форм). Однако, применяя еще раз правило прямого счета, вместо ближайшего большего числа получаем другое изображение нуля: 0.000. Только следующее применение правила прямого счета дает изображение ближайшего большего числа: 0.001. Аналогичная картина наблюдается и при обратном счете.
Таким образом, выполняя счет в обратных кодах, нужно при переходе через нуль сделать один лишний (холостой) просчет. Соответствующим образом несколько усложняются правила сложения и вычитания (по сравнению с правилами сложения и вычитания в дополнительных кодах). Преимуществом же обратных кодов перед дополнительными является более простая связь с прямыми кодами: преобразование числа из прямого кода в обратный и из обратного кода в прямой является поразрядной операцией.