Ср. Ноя 20th, 2024

Для получения дополнительного 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 в его дополнительный код правила обычной двоичной арифметики оказываются нарушенными, а именно:

1111 11112 +1 = 1 0000 00002 = 2k

Но, поскольку описанные действия производятся в k двоичных разрядах, левая единица результата оказывается лишней и игнорируется.

Отметим еще раз, что в k-разрядной целочисленной компьютерной арифметике 2k = 0.

От content