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

Двоично дополнительный код - форма представления, при которой вычитание можно привести к сложению (суммированию) в двоичной системе.

Как получить дополнительный код числа?

(не могу не упомянуть о замечательной статье ссылка на которую есть здесь)

Начнём с того, что операции должны проводиться с определённым числом разрядов - для примера рассмотри 8 бит:

0 0 0 0 | 0 0 0 0

чтобы легче было читать будем ставить ("чисто для разметки") вертикальную черту после 4-ёх первых бит.

Второй момент - первый разряд (бит) в двоично дополнительном коде служит для определения знака числа.
И третье - положительные числа в двоично дополнительном коде кодируется также как и в "обычной жизни" - но помним о том. что в первом разряде должен быть ноль, например максимальное из чисел которое можно закодировать в двоично-дополнительном коде = +127:

0 1 1 1 | 1 1 1 1

Также полезно ознакомиться с такой вот таблицей:

Десятичное
представление	Код двоичного представления (8 бит)

             прямой         обратный      дополнительный
			 
127       	01111111       	01111111       	01111111       
1       	00000001       	00000001       	00000001       
0       	00000000       	00000000       	00000000       
-0       	10000000       	11111111       	---       
-1       	10000001       	11111110       	11111111       
-2       	10000010       	11111101       	11111110       
-3       	10000011       	11111100       	11111101       
-4       	10000100       	11111011       	11111100       
-5       	10000101       	11111010       	11111011       
-6       	10000110       	11111001       	11111010       
-7       	10000111       	11111000       	11111001       
-8       	10001000       	11110111       	11111000       
-9       	10001001       	11110110       	11110111       
-10       	10001010       	11110101       	11110110       
-11       	10001011       	11110100       	11110101       
-127       	11111111       	10000000       	10000001       
-128         ---             ---            10000000   
  

Получение двоично дополнительного кода для отрицательных чисел

Следует сделать следующее (для отрицательного числа):

  1. Записать модуль числа в двоичной форме в указанное количество разрядов, например для -4 его модуль |-4| = 4:
    0 0 0 0 | 0 1 0 0
  2. Инвертировать все разряды (значения бит):
    0 0 0 0 | 0 1 0 0
                       ------->
    1 1 1 1 | 1 0 1 1
  3. Прибавить единицу:
    1 1 1 1 | 1 0 1 1
                           +
    0 0 0 0 | 0 0 0 1
    --------------
    1 1 1 1 | 1 1 0 0

Вот мы и получили представление числа -4 в двоично-дополнетельном коде:

1 1 1 1 | 1 1 0 0

Обратное преобразование

Что мы можем сказать о данном числе "чисто на взгляд", если не знаем из какого десятичного оно получено?
Фактически нас интересуют две вещи:

  1. Какого знака это число
  2. Должны ли мы переводить это число "обратно" в прямой двоичный код

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

  1. вычитаем единицу
  2. инвертируем все разряды