Для получения дополнительного k-разрядного кода отрицательного числа необходимо следующее:
Заметим, что получение дополнительного кода одного и того же отрицательного числа для типов разной разрядности на основе ранее полученного дополнительного кода сводится к удалению или добавлению левых дополнительных разрядов, заполненных единицами.
Для 8-разрядной ячейки:
Для 16-разрядной ячейки:
Пробелы делят данное представление на группы из 4-х двоичных цифр. Сравним два кода 1000 10112 и 1111 1111 1000 10112. Они отличаются лишь подчеркнутой частью, длина которой равна разнице между разрядностью рассматриваемых ячеек.
При представлении отрицательного числа 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.