В этой статье попробую вкратце изложить идею понимания дополнительного кода в компьютере как понимаю её я. Что же, приступим.
Идея дополнительного кода — не усложнять аппаратную реализацию операций сложения и вычитания. При дополнительном коде используется та же реализация операций сложения и вычитания что и для целых беззнаковых чисел.
Чтобы дополнительный код работал, используется трюк с переполнением значения регистра. Допустим, у нас есть 8-битный регистр. Если в нём содержится 111111112, то при прибавлении 12 происходит переполнение и в регистре оказывается 000000002. Это похоже на то, как если бы мы сложили -1 и 1 и получили 0.
Предположим, что 111111112 это и есть представление -110 в нашем «магическом» дополнительном коде. Возникает вопрос — как преобразовывать положительные целые числа в отрицательные в дополнительном коде?
Итак, необходимо получить 111111112 исходя из 000000012. Инвертируем биты — получаем 111111102. Остаётся добавить к этому числу 12, чтобы получить требуемое. Добавляем бит. Не это ли искомый алгоритм? Проверяем для других чисел и убеждаемся что всё работает правильно.
Строгое доказательство, наверняка, есть в умных книгах, мне же этого пока достаточно.