logo
Лекция_Представление_информации_в_компьютере1

Алгоритм получения дополнительного k-разрядного кода отрицательного числа

  1. Модуль числа представить прямым кодом в k двоичных разрядах.

  2. Значения всех разрядов инвертировать (все нули заменить на единицы, а единицы — на нули), получив, таким образом, k-разрядный обратный код исходного числа.

  3. К полученному обратному коду, трактуемому как k-разрядное неотрицательное двоичное число, прибавить единицу.

Обратный код является дополнением исходного числа до числа 2k- 1, состоящего из k двоичных единиц. Поэтому прибавление единицы к инвертированному коду позволяет получить его искомый дополнительный код.

Пример . Получим дополнительный код числа -52 для восьми- и шестнадцатиразрядной ячеек.

Для восьмиразрядной ячейки: 00110100 — прямой код числа |-52| = 52;

1100 1011 — обратный код числа -52;

1100 1100 — дополнительный код числа -52

Для шестнадцатиразрядной ячейки:

0000 0000 0011 0100 — прямой код числа -|52|;

1111 1111 1100 1011 — обратный код числа -52;

1111 1111 1100 1100 — дополнительный код числа-52.

Вопрос. Какое минимальное отрицательное число можно записать в k разрядах?

Ответ. Описанный выше алгоритм получения дополнительного кода для отрицательного числа знаковую единицу в левом разряде образует автоматически при |m|<=2k-1. Если же 2k-1<|m|<2k, то попытка реализации данного алгоритма приведет к тому, что в левом разряде будет находиться цифра 0, соответствующая компьютерному представлению положительных чисел, что неверно. Представим значение 2k-|m| в следующем виде: 2k-|m| = 2k-1 +(2k-1 - |m|). Здесь первое слагаемое 2k-1 соответствует единице в левом знаковом разряде. То есть при представлении отрицательного числа m дополнительным кодом в самом левом (знаковом) разряде записывается знак отрицательного числа (единица), а в остальных разрядах — число 2k-1 - |m|. Следовательно, минимальное отрицательное (максимальное по модулю) число т, которое можно представить в k разрядах, равно -2k-1 (это ограничение и было приведено в определении 2).

Дополнительный восьмиразрядный код для чисел -128, -127 и -0 приведены в таблице:

Число

-128

-127

-0

Прямой код модуля

1000 0000

01111111

0000 0000

Обратный код

0111 1111

1000 0000

11111111

Дополнительный код

1000 0000

1000 0001

0000 0000

Отметим, что для числа -128 прямой код совпадает с дополнительным, а дополнительный код числа -0 совпадает с обычным нулем. При преобразовании обратного кода для числа -0 в его дополнительный код правила обычной двоичной арифметики нарушаются, а именно:

1111 11112+ 1 = 1 0000 00002 = 2k = 0.

Восстановить модуль исходного десятичного отрицательного числа по его дополнительному коду можно двумя способами.

Способ 1 (обратная цепочка преобразований): вычесть единицу из дополнительного кода, инвертировать полученный код и перевести полученное двоичное представление числа в десятичное.

Способ 2: по приведенному выше алгоритму построить дополнительный код для имеющегося дополнительного кода искомого числа и представить результат в десятичной системе счисления.

Пример. Получим десятичное значение числа по его дополнительному коду 100101112.

Способ 1:

  1. из дополнительного кода вычтем 1: 10010111 - 1 = 10010110 (получили обратный код);

  2. инвертируем полученный код: 01101001 (получили модуль отрицательного числа);

  3. переведем полученное двоичное значение в десятичную систему счисления: 011010012 = 26 + 25 + 23 + 1 = 64 + 32 + 8 + 1 = 105.

Ответ: -105.

Способ 2:

  1. инвертируем имеющийся дополнительный код: 01101000;

  2. прибавим к результату 1: 01101000 + 1 = 01101001 (получили модуль отрицательного числа);

  3. переведем полученное двоичное значение в десятичную систему счисления: 011010012 = 26 + 25 + 23 + 1 = 64 + 32 + 8 + 1 = 105.

Ответ-. -105.

Целые числа со знаком, представимые в k разрядах, принадлежат диапазону [-2k-1, 2k-1 -1], который не является симметричным относительно 0. Это следует учитывать при программировании. Если, например, изменить знак у наибольшего по модулю отрицательного числа, то полученный результат окажется уже не представимым в том же числе разрядов.

Ниже приведены значения границ диапазонов для знаковых представлений в ячейках с различной разрядностью:

Разрядность

Минимальное число

Максимальное число

8

-128

127

16

-32768

32767

32

-2147483648

2147483647

64

-9223372036854775808

9223372036854775807