Рейтинг:  0 / 5

Звезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активна
 

Сложение двоичных чисел выполняется так, как это предписано правилами двоичной арифметики. Вычитание заменяется сложением, причем для положительных значений слагаемых используется представление в прямом коде, а для отрицательных значений — обратные или дополнительные коды. При этом отпадает необходимость в создании блоков АЛУ, выполняющих вычитание, что позволяет упростить конструкцию арифметико-логического устройства. Двоичное сложение отрицательных чисел в дополнительном коде проще и экономичнее (требует меньше операций), чем в обратном или прямом. Для того чтобы убедиться в этом, рассмотрим примеры выполнения операции сложения.

 

Разберем четыре случая, возникающих при вычислении суммы х + у.

1. х > 0, у>10. Суммируются все двоичные разряды прямого кода слагаемых, в том числе разряды знака. Например:

510 + 910 =0000 01012 + 0000 10012 = 0000 11102= 1410.

При выполнении переноса двоичных разрядов результирующее значение может оказаться длиннее п -1 разряда, отведенного на модуль числа (n — длина представления). В этом случае старший разряд суммы переносится в разряд знака, и результат окажется неправильным (сумма двух положительных чисел получится отрицательной). Такая ситуация называется переполнением разрядной сетки. При программировании ее следует избегать.

2. х>=0, у<=0, |y| > |x|. Например:

510 + (-910) =  0000 01012 + 1111 01102 = 1111 10112 = 1000 01002 = -410

3. х>=0, у<=0, |y| < |x|. Например:

910 + (-510) = 0000 10012 + 1111 10102 = (1)0000 00112 = +310.

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

0000 01002 =410

4. х<=0, у<=0 Например:

(-910)+(-510)=1111 01102+ 1111 10102= (1) 1111 00002= -11210

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

Рассмотрим теперь сложение чисел в дополнительных кодах. Здесь следует рассмотреть те же четыре случая, что и для обратных кодов

1. x>=0, у >= 0. Суммируются все двоичные разряды прямого кода слагаемых, в том числе старшие (разряды знака). Поскольку в данном случае используется прямой код, единственная возможная проблема — переполнение разрядной сетки.

2. x>=0, y<=0 |y|>|x|

510+(-910)=0000 01012+ 1111 01112= 1111 11002= 1000 01002=-410

При преобразовании дополнительного кода в прямой знаковый разряд остается неизменным, остальные разряды инвертируются (то есть единицы заменяются нулями, и наоборот) и к младшему разряду прибавляется единица.

3. x>=0, у <= 0, |у| < |x|. Например:

910 + (-510) = 0000 10012 + 1111 10112=(1)0000 01002 = 410.

Здесь результат, если отбросить перенос из знакового разряда, правильный.

4. x<= 0, у <= 0. Например:

(-910) + (-510) = 1111 01112 + 1111 10112 = (1)1111 00102 = 1000 11102 = -1410

Результат также правильный.

Двоичное сложение можно заменить логическими операциями. Пусть слагаемые в двоичном представлении — это X и Y. Введем дополнительное двоичное число Т, количество разрядов в котором совпадает с количеством разрядов в наибольшем из X и У, а значение разряда 0, если при суммировании X и У не выполнялся перенос, и 1, если перенос выполнялся. Тогда сумма может быть вычислена по формуле

S= Т Xor X Хог У,

где Хог—логическая операция "исключающее или". Здесь она применяется к соответствующим разрядам-битам. Ее результат равен единице, только если оба операнда принимают различные значения.