Дополнительные коды
Пусть в качестве цифр В-ичной системы счисления выбраны В неотрицательных целых чисел 0,1,2,..., В – 1. При использовании позиционного способа изображения чисел с естественными весами разрядов все m-разрядные числа, которые можно записать с помощью этих цифр, заключены в интервале от 0 до примерно dB (где d – вес старшего разряда); общее количество различных чисел в этом интервале равно B m .
Если мы хотим оперировать не только с положительными, но и с отрицательными числами, то это значит, что количество различных чисел должно удвоиться. Для этого так или иначе к т основным разрядам нужно добавить еще один двоичный разряд. Все дело только в том, как использовать этот разряд. При записи чисел прямым кодом дополнительный двоичный разряд является просто разрядом алгебраического знака; ему не приписывается никакого определенного веса, поэтому и расположение его относительно других разрядов может быть выбрано чисто условно: знак можно писать и слева от числа, и справа о него – никакого значения это не имеет.
При использовании дополнительных кодов добавочный двоичный разряд записывается всегда слева от старшего из В-ичных разрядов. Разрядная сетка ЭВМ расположена обычно так, что добавочный разряд оказывается в целой части числа. Если бы этому разряду приписывался естественный вес, то его вес был бы равен d0 = dВ, где d – вес старшего В-ичного разряда.
Во многих случаях разрядная сетка располагается так, что старший из В-ичных разрядов является первым разрядом дробной части числа, его вес при этом равен 1/В; добавочный двоичный разряд оказывается тогда первым разрядом целой части числа, его естественный вес должен равняться единице:
![]()
Исходя из этого дополнительный код может быть получен одним из двух способов, которые приводят почти к одинаковым результатам.
Первый вариант состоит в том, что добавочному двоичному разряду приписывается вместо его естественного веса d0 вес (–d0). Ясно, что при наличии цифры «0» в добавочном разряде все число в целом положительно или равно нулю; его основные разряды изображают абсолютную величину числа точно так же, как и при использовании прямых кодов. При наличии цифры «1» в добавочном разряде [с весом (–d0)] все число в целом отрицательно, потому что величина, записанная всеми остальными разрядами числа, какие бы цифры ни были в этих разрядах, непременно меньше, чем d0. В основных разрядах при этом тоже записана, как и при использовании прямых кодов, абсолютная величина числа, но записана она в виде дополнения до d0; иначе говоря, для числа (х < 0) в основных разрядах вместо величины |x| записана величина d0 – |x|. Отсюда и название: дополнительный код. Добавочный двоичный разряд при использовании дополнительных кодов может рассматриваться как разряд знака: если в нем стоит цифра «0», число положительно, если «1» – отрицательно.
Пример 1.16.
Пусть, например, используется десятичная система счисления (B = 10) и в качестве основных разрядов числа выбраны 1-й, 2-й и 3-й разряды дробной части. Величина, записанная этими разрядами, находится в интервале от 0 (число .000) до почти 1 (число .999). Чтобы иметь возможность оперировать не только с положительными, но и с отрицательными числами, нужно к трем десятичным разрядам добавить еще один двоичный разряд. Если мы пользуемся прямым кодом, то этот дополнительный разряд является разрядом алгебраического знака («+» или «–» ). Например, число (+0,537) записывается в виде (+.537), число (– 0,537) – в виде (–.537).
Если мы пользуемся дополнительным кодом, то добавочный двоичный разряд (с допустимыми для него цифрами 0, 1) размещается обязательно слева от старшего из основных разрядов, т.е. на месте первого разряда целой части числа. Его естественный вес d0 должен быть равен единице. При этом например, число (+0,537) записывается в виде ( 0.537) (где курсивом выделен двоичный разряд), число ( –0,537) должно быть записано в виде (1. 463). Основные (десятичные) разряды отрицательного числа при этом представляют его абсолютную величину в виде дополнения до d0 = 1 ( .463 = 1.000 – .537).
Число нуль при использовании прямого кода может быть записано либо в виде ( + .000), либо в виде ( – .000). При использовании дополнительного кода число нуль записывается однозначно в виде ( 0. 000). Комбинация ( 1. 000) соответствует при этом максимальному по абсолютной величине отрицательному числу: 1.000 = 1× (–1) + 0×1/10 + 0×1/100 + 0×1/1000 = –1.
(В прямом коде максимальное по абсолютной величине отрицательное число при том же количестве разрядов равно (–.999); одна лишняя комбинация израсходована на неоднозначность в изображении нуля.)
Пример 1.17.
Используется двоичная система счисления; в качестве основных разрядов выбраны 1-й, 2-й, 3-й и 4-й разряды дробной части. В прямом коде число (+11/16) записывается в виде (+.1011), число (–11/16) – в виде (–.1011). В дополнительном коде число (+11/16) имеет вид (0.1011), а число (–11/16) – (1.0101). В данном случае вес добавочного (первого слева от запятой) разряда равен (–1), поэтому записанное указанным образом число равно
![]()
При этом в основных разрядах находится величина (.0101) = 5/16, являющаяся дополнением от абсолютной величины отрицательного числа до единицы (d0 = 1):
![]()
В рассмотренном варианте построения дополнительного кода допущено отступление от естественного порядка весов, заключающееся в установлении для добавочного (знакового) разряда веса (–d0) вместо его естественного веса (d0).
Второй вариант построения дополнительного кода состоит в следующем. Добавочному двоичному разряду, который размещается слева от старшего из основных разрядов, приписывается его естественный вес d0. Но при этом предполагается, что число, записанное добавочным и основными разрядами, отличается от истинного числа на величину d0. Чтобы получить истинное значение любого числа, нужно из числа, записанного в разрядной сетке (включая добавочный разряд), вычесть величину d0.
Основными разрядами может быть представлена величина, лежащая в интервале от 0 до примерно d0. Добавив слева один двоичный разряд с весом d0, мы получаем возможность записывать величины от 0 до примерно 2d0. При этом истинные значения чисел будут находиться в интервале от (–d0) до примерно (+d0).
Если в изображении числа имеется единица в добавочном разряде (с весом d0), то, вычитая поправку d0, мы получим неотрицательное число; его абсолютная величина записана в основных разрядах точно так же, как при использовании прямых кодов. Если в изображении числа в добавочном разряде имеется нуль, то величина, записанная в разрядной сетке, меньше d0; вычитая поправку d0, мы получим отрицательное число, абсолютная величина которого представлена основными разрядами разрядной сетки в виде дополнения до d0.
Если использовать пример, рассмотренный для первого варианта, то при построении дополнительного кода по второму варианту число (+ 0,537) должно быть записано в виде (1.537).
Здесь вес добавочного двоичного разряда d0 равен единице. Поэтому постоянная аддитивная поправка ко всем числам есть (–1). Истинное значение числа, представленного в виде (1.537), равно 1,537 – 1 = +0,537. Число (–0,537) должно записываться в виде (0.463).
В такой записи истинное значение числа равно 0,463 – 1 = – 0,537.
Число нуль изображается в виде 1.000 (так как 1,000 – 1 = 0,000).
Максимальное по абсолютной величине отрицательное число записывается в виде 0.000.
Его истинное значение равно 0,000 – 1 = –1.
Таким образом, дополнительный код, построенный по второму варианту, отличается от дополнительного кода, построенного по первому варианту, тем, что в добавочном (знаковом) разряде для положительных чисел записывается 1 вместо 0, а для отрицательных чисел – 0 вместо 1.
Точно так же в примере 1.17 при построении дополнительного кода по второму варианту число +11/16 должно записываться в виде (1.1011), число (–11/16) – в виде (0.0101).
Здесь также различие между дополнительными кодами, построенными по первому и по второму вариантам, оказывается чисто формальным.
Дополнительный код, построенный по первому варианту, можно при определенных условиях свести к дополнительному коду, построенному как бы по второму варианту. Для этого нужно к изображению числа в первом варианте дополнительного кода приписать слева еще один добавочный двоичный разряд и установить в этом разряде цифру, противоположную той, которая имеется в первом добавочном разряде. Далее можно считать, что все разряды имеют естественные веса (в частности, добавочный разряд, имевшийся прежде вес +d0 , новый добавочный разряд вес +2d0), но что величина, записанная в разрядной сетке, отличается от истинного значения числа на величину 2d0. Такой код называют иногда модифицированным дополнительным кодом.
В примере 1.16 в дополнительном коде, построенном по первому варианту, число (+0,537) записывалось в виде (0.537); число (–0,537) – в виде (1.463). Действуя указанным способом, записываем изображения этих чисел в виде соответственно (10.537) и (01.463). Курсивом, как и прежде, выделены двоичные разряды. Полагая, что они имеют естественные веса (2d0 = 2; d0 = 1), найдем величины, записанные в разрядной сетке:
![]()
Добавляя к этим величинам постоянную поправку (–2d0 = –2), найдем, что истинные значения чисел равны соответственно (+0,537) и (–0,537).
При использовании дополнительных кодов, построенных по второму варианту, нельзя подобрать таких весов разрядов, чтобы истинное значение любого числа получалось суммированием его цифр с этими весами. Таким образом, дополнительные коды, построенные по второму варианту, не являются, строго говоря, позиционным способом записи чисел. Однако и в первом, и во втором вариантах дополнительные коды близки по своим свойствам к позиционному изображению чисел с естественными весами разрядов.
В частности, и правила округления, и правила счета здесь такие же, как правила, сформулированные для позиционного изображения чисел с естественными весами разрядов. Одни и те же правила счета могут одинаково применяться как к положительным, так и к отрицательным числам (чем дополнительные коды выгодно отличаются от прямых кодов).
Справедливость последнего утверждения для дополнительных кодов, построенных по второму варианту, очевидна: изображения всех чисел (и положительных, и отрицательных) положительны и представлены позиционным способом с естественными весами разрядов; наличие для всех чисел постоянной поправки никак не сказывается при применении правил счета.