Алгебраическое сложение-вычитание в дополнительных кодах
В дополнительных кодах сложение и вычитание выполняются, как правило, проще, чем в прямых кодах.
Для определенности будем полагать, что дополнительный код построен по варианту, когда положительные числа содержат в разряде алгебраического знака «0», а отрицательные – цифру «1». Будем считать также, что разряд алгебраического знака является первым разрядом в целой части числа и потому вес его равен (–1) вместо естественного веса (+1), а т основных разрядов числа находятся все в дробной части числа. При этом все положительные числа будут представлены в двоичной системе чисто позиционным способом, с естественными весами разрядов, с цифрами 0, 1 и с запятой, фиксированной перед первым (старшим) из основных разрядов; отличие веса знакового разряда от естественного не играет роли для положительных чисел, так как цифра данного разряда есть «0». Так как для отрицательных чисел в знаковом разряде содержится «1», то в способе изображения отрицательных чисел формально имеется небольшое отступление от естественных весов разрядов.
При использовании дополнительных кодов алгебраическое сложение-вычитание B ± C может выполняться следующим методом:
1) если выполняется вычитание, то обратить код числа C (в том числе изменить и знак С на противоположный);
2) выполнить суммирование чисел В и С, обращаясь при этом с разрядом алгебраического знака точно так же, как с остальными (младшими) разрядами чисел; если идет вычитание, то при выполнении суммирования подать единицу на вход переноса младшего разряда.
Никакой предварительной расшифровки знаков не требуется: правило выполнения сложения, как и правило выполнения вычитания, всегда одно и то же, независимо от знаков чисел.
Проверим правильность приведенного алгоритма для случая выполнения сложения. Фактически выполнение сложения сводится к простому суммированию разрядов чисел В и С (п. 1 пропускается). При этом важно только проследить, чтобы при суммировании двух положительных чисел не было переноса в разряд знака, а при суммировании двух отрицательных чисел перенос в разряд знака непременно был (невыполнение этих условий означает переполнение разрядной сетки); при суммировании чисел разных знаков перенос в разряд алгебраического знака может быть, а может и не быть.
Пусть имеем два положительных числа. При этом в основных разрядах содержатся их абсолютные величины (|В| и |С|), в разрядах знака – нули. При суммировании получим в основных разрядах величину |B| + |C|; если эта величина меньше единицы (как это и требуется – иначе было бы переполнение), то перенос в разряд знака отсутствует и при суммировании в этом разряде сохранится нуль (0+0+0=0). Таким образом, результат суммирования представляет собой правильный результат сложения двух положительных чисел.
Пусть теперь имеем два отрицательных числа. В основных разрядах при этом содержатся дополнения до единицы от их абсолютных величин (1 – |B|) и (1 – |C|), в разрядах алгебраических знаков – единицы. При суммировании основных разрядов в них образуется величина
(1 – |B|) + (1 – |C|) = 1 + 1 – (|B| + |C|).
Если бы эта величина была меньше единицы, то это означало бы, что |B| + |C| > 1, т.е. имелось бы переполнение разрядной сетки. Нормально, когда |B| + |C| < 1, результат суммирования в основных разрядах больше единицы; поэтому в основных разрядах остается величина 1 – (|B| + |C|) и возникает перенос в разряд знака. С учетом этого переноса суммирование в разряде знака дает
1 + 1 + 1 = 1,
т. e. сохраняет знак «–». Полученный результат (знак «–» и величина 1 – (|B| + |C|) в основных разрядах) представляет собой сумму двух отрицательных чисел В и С, записанную, как это и требуется, дополнительным кодом.
Предположим, наконец, что складываются два числа разных знаков, скажем В > 0 и С < 0. Для числа В основные разряды содержат величину |В|, а разряд знака – «0», для С в основных разрядах содержится 1 – |C|, в разряде знака – «1». Суммирование в основных разрядах дает величину |В| + (1 – |С|) = 1 + |B| – |C|.
Если |B| ³ |C|, то эта величина больше единицы; при этом в основных разрядах остается |B| – |C|, а единица переносится в разряд знака, где суммирование даст
0 + 1 + 1 = 0,
т.е. знак «+». Если |B| < |C|, то 1+ |B| – |C| < 1, в основных разрядах остается вся эта величина, а перенос в разряд знака отсутствует; в разряде знака суммирование теперь даст 0 + 1 + 0 = 1, т.е. знак «–». В первом случае (|B| > |C|) получаем положительный результат сложения (знак «+» и величина |B| – |C| в основных разрядах), во втором случае (|B| – |C|) – отрицательный результат сложения, выраженный, как и требуется, дополнительным кодом (знак «–» и величина 1 – |(C| – – |B|) в основных разрядах).
Выполнение вычитания отличается тем, что перед суммированием производится обращение кода вычитаемого, а при суммировании добавляется лишняя единица младшего разряда. Таким образом, фактически код вычитаемого заменяется дополнительным кодом, т. e. числом с обратным знаком, которое и складывается обычным порядком с уменьшаемым.

