Для получения дополнительного k-разрядного кода отрицательного числа необходимо следующее:
- Модуль числа представить прямым кодом в k двоичных разрядах.
- Значения всех бит инвертировать (все нули заменяются на единицы, а единицы на нули), таким образом получается k-разрядный обратный код исходного числа.
- К полученному обратному коду, трактуемому как k-разрядное неотрицательное двоичное число, прибавить единицу.
Заметим, что получение дополнительного кода одного и того же отрицательного числа для типов разной разрядности на основе ранее полученного дополнительного кода сводится к удалению или добавлению левых дополнительных разрядов, заполненных единицами.
При представлении отрицательного числа m дополнительным кодом в самом левом (знаковом) бите записывается знак отрицательного числа (единица), а в остальных разрядах записывается число 2k-1 — |m|. Если это число рассматривать как положительное, то максимальное по модулю отрицательное число, которое можно представить в k— разрядах, равно -2k-1.
Описанный выше алгоритм получения дополнительного кода для отрицательного числа знаковую единицу в левом разряде образует автоматически при |m| ≤ 2k-1. Если же 2k-1 < |m| < 2k, то попытка реализации данного алгоритма приведет к тому, что в левом разряде будет находиться цифра 0. Это соответствует компьютерному представлению положительных чисел, что неверно. Именно поэтому в определении дополнительного кода на значение наложено ограничение.
Для полноты рассмотрения получим дополнительно 8-разрядный код для чисел -128 (минимальное представимое число), -127 (число, обратное максимально представимому) и -0.
Число
|
-128
|
-127
|
-0
|
Прямой код модуля
|
10 000 000
|
01 111 111
|
00 000 000
|
Обратный код
|
01 111 111
|
10 000 000
|
11 111 111
|
Дополнительный код
|
10 000 000
|
10 000 001
|
00 000 000
|
Отметим, что для числа -128 прямой код совпадает с дополнительным, а дополнительный код числа -0 совпадает с обычным нулем. Однако при преобразовании обратного кода для числа -0 в его дополнительный код правила обычной двоичной арифметики оказываются нарушенными, а именно:
Но, поскольку описанные действия производятся в k двоичных разрядах, левая единица результата оказывается лишней и игнорируется.
Отметим еще раз, что в k-разрядной целочисленной компьютерной арифметике 2k = 0.