
Представление числа в дополнительном коде
При записи числа в дополнительном коде старший разряд является знаковым. Если его значение равно 0, то в остальных разрядах записано положительное двоичное число, совпадающее спрямым кодом. Если число, записанное в прямом коде, отрицательное, то все разряды числа инвертируются, а к результату прибавляется 1. К получившемуся числу дописывается старший (знаковый) разряд, равный 1.
127 01111111 01111111
1 00000001 00000001
0 00000000 00000000
Преобразование числа из прямого кода в дополнительный осуществляется по следующему алгоритму.
Если число, записанное в прямом коде, положительное, то к нему дописывается старший (знаковый) разряд, равный 0, и на этом преобразование заканчивается;
Если число, записанное в прямом коде, отрицательное, то все разряды числа инвертируются, а к результату прибавляется 1. К получившемуся числу дописывается старший (знаковый) разряд, равный 1.
Преимущества
Один и тот же регистр может хранить как n-битовое положительное число, так и (n−1)-битовое число со знаком, с общими для обоих форматов операциями сложения, вычитания и левого сдвига.
Более удобная упаковка чисел в битовые поля.
Отсутствие числа «минус ноль».
Недостатки
Дополнительный код неочевиден для новичков.
В сложных форматах (таких, как плавающая запятаяилидвоично-десятичный код) большинство преимуществ аннулируются.
Модуль наибольшего числа не равен модулю наименьшего числа. Пример: знаковое целое 8-байтовое. Максимальное число: 12710== 7F16== 011111112. Минимальное число: -12810== 8016,дополнительный код== 100000002,дополнительный код. Соответственно, не для любого числа существует противоположное. Операция изменения знака может потребовать дополнительной проверки.