+ 1,010011
1,111001
1¬1,001100 (Спр= 1,110100)
При сложении в дополнительном коде возможно переполнение разрядной сетки (в первом и четвертом случаях). Признаком переполнения является отличие знака полученной суммы от знаков слагаемых.
Числа в обратном коде представляются в следующем виде для двоичных чисел:
Обратный код положительного числа совпадает с его представлением в прямом коде. Обратный код отрицательного числа получают инвертированием всех разрядов числа, кроме знакового.
[A]пр=0,10110100; [A]ок=0,10110100;
[В]пр=1,10111101; [В]ок=1,01000010.
В обратном коде, как и в дополнительном, операция вычитания заменяется операцией сложения. При этом знаковый разряд и цифровая часть числа рассматриваются как единое целое. Правильный знак суммы получается в результате суммирования цифр знаковых разрядов операндов и единицы переноса из цифровой части, если она есть. Характерной особенность сложения в обратном коде является наличие циклического переноса (если он возникает) из знакового разряда в младший разряд цифровой части, благодаря которому осуществляется коррекция суммы на 2-n.
Рассмотрим все возможные варианты сложения чисел в обратном коде:
1) А›0, В›0, С›0.
А=+0,101101 В=+0,000111
Апр=0,101101 Впр=0,000111
Аок=0,101101 Вок=0,000111 Сок=Аок+Вок
+0,101101
0,000111
0,110100
2) А›0, В‹0, С›0.
А=+0,101101 В=-0,000111
Апр=0,101101 Впр=1,000111
Аок=0,101101 Вок=1,111000 Сок=Аок+Вок
+ 0,101101
1,111000
1ß0,100101 (1 переноса из знакового разряда суммы прибавляется в
à 1 младший значащий разряд результата)
0,100110
3) А‹0, В›0, С‹0.
А=-0,101101 В=+0,000111
Апр=1,101101 Впр=0,000111
Аок=1,010010 Вок=0,000111 Сок=Аок+Вок
+ 1,010010
0,000111
1,011001 (Спр= 1,100110)
4) А‹0, В‹0, С‹0.
А=-0,101101 В=-0,000111
Апр=1,101101 Впр=1,000111
Аок=1,010010 Вок=1,111000 Сок=Аок+Вок
+ 1,010010
1,111000
1ß1,001010 (1 переноса из знакового разряда суммы прибавляется в
à 1 младший значащий разряд результата)
1,001011 (Спр= 1,110100)
При сложении в обратном коде, как и в дополнительном, в 1-м и 4-м случаях возможно переполнение.
Для упрощения обнаружения переполнения разрядной сетки ЭВМ используются модифицированный обратный и модифицированный дополнительный коды.
При представления положительных чисел в модифицированном коде в знаковых разрядах используется 00, а отрицательных - 11. Признаком переполнения разрядной сетки являются разные значения в знаковых разрядах.
Пример 1.
[А]мок=00,101101 [В]мок=00,011100
00,101101
00,011100
01,001001 - положительное переполнение
Пример 2.
[А]мок=11,010010 [В]мок=11,100011
11,010010
11,100011
1←10,110101
à + 1
10,110110 - отрицательное переполнение.
К операции сдвига приходиться обращаться при выполнении сложения в машине с плавающей запятой, а также при выполнении операций умножения и деления в ЭВМ обоих типов. Во всех этих операциях производится сдвиг мантисс, поэтому будут рассматриваться только числа с фиксированной запятой.
Сдвиг прямого кода числа на k разрядов вправо эквивалентен умножению этого числа на 2-k. Ввиду того, что при сдвиге вправо младшие разряды сдвигаемого числа выходят за пределы разрядной сетки машины и теряются, погрешность представления сдвинутого кода числа имеет отрицательный знак для кодов положительных чисел и положительный знак для кодов отрицательных чисел. Для ее уменьшения необходимо предпринимать округление чисел. При сдвиге прямого кода отрицательной дроби сдвигается только ее мантисса, а знак остается без изменения.
Пример 1.
А= 1,011010, k=1 (левый сдвиг) k=-1 (правый сдвиг)
21хА=1,110100 2-1хА=1,001101
Сдвиг прямого кода числа влево на k разрядов эквивалентен умножению числа на 2k. Эта операция корректна до тех пор, пока старшие значащие цифры не начнут выходить за пределы разрядной сетки, т.е. пока число по абсолютной величине не станет больше 1. При сдвиге влево освобождающиеся справа разряды заполняются 0.
Сдвиг положительного числа влево или вправо в дополнительном или обратном кодах ничем не отличаются от сдвига положительного числа в прямом коде.
Под сдвигом отрицательного числа А, записанного инверсным (дополнительным или обратным) кодом, понимается преобразование инверсного кода отрицательного числа А в инверсный код отрицательного числа Ах2-kв случае сдвига вправо и Ах2k в случае сдвига влево.
Общим правилом сдвига дробей вправо в инверсном коде является наличие передачи из знакового разряда в старший цифровой разряд и восстановление знака, т.е. освобождающиеся справа разряды заполняются 1.
При сдвиге влево освобождающиеся справа разряды в обратном коде заполняются 1, а в дополнительном - 0. Количество сдвигов правильной дроби влево ограничено условием | Ах2k |<1, т.е. сдвиг допустим лишь до тех пор, пока в разряде справа от запятой не появится 0 (пока сохраняется знак результата). Перемена знака результата при сдвиге влево является признаком переполнения, который для отрицательных и положительных чисел совпадает с признаком переполнения, возникающим при сложении кодов двух чисел.
Пример 2.
Сдвиг в обратном коде:
[А]о= 1,011010, k=1 (левый сдвиг) k=-1 (правый сдвиг)
21хА=1,110101 2-1хА=1,101101
Сдвиг в дополнительном коде:
[А]д= 1,011010, k=1 (левый сдвиг) k=-1 (правый сдвиг)
21хА=1,110100 2-1хА=1,101101
Результат сложения двух чисел А=pmaa; B=pmbb, представленных в форме с плавающей запятой, должен быть тоже числом вида С=pmсc (здесь a, b, c – мантиссs, ma, mb, mc – порядокb). При этом должно выполняться равенство:
pmaa+ pmbb= pmсc
При сложении чисел, представленных в нормальной форме, можно выделить 4 этапа:
1. Уравниваются порядки слагаемых: меньший порядок увеличивается до большего, а мантисса преобразуемого числа сдвигается вправо на соответствующее количество разрядов.
Для этой цели производится вычитание порядков чисел. Знак и модуль разности будут определять соответственно, какое из слагаемых нужно преобразовывать и на сколько разрядов сдвигать мантиссу.
2. Производится преобразование мантисс в один из модифицированных инверсных кодов: дополнительный или обратный.
3. Выполняется сложение мантисс по правилам сложения чисел с фиксированной запятой.
4. Производится нормализация результата и преобразование в прямой код, приписывается общий порядок слагаемых и выполняется округление мантиссы результата.
Пример 1. Прямой код.
А: mа=0,011; a=1,101010; В: mв=0,101; b=0,110010;
т.к. mа - mв= 2? то необходимо mа увеличить до mв и откорректировать мантиссу числа А сдвигом на 2 разряда вправо.
А’: m’а=0,101; a=1,001010;
[a’]Д=11,110110; [b]Д=00,110010;
+11,110110; 00,110010
В зависимости от абсолютных величин мантисс слагаемых результат может получиться нормализованным, или денормализованным (влево – переполнение, или вправо). Положительные нормализованные числа имеют 1 в старшем разряде мантиссы, а отрицательные числа, записанные в инверсном коде. имеют 0 в этом разряде. Несовпадение цифр в знаковых разрядах свидетельствует о денормализации влево (переполнение), а совпадение цифр знакового и старшего значащего разряда мантиссы - о нарушении нормализации вправо (правая денормализация).
Правила устранения денормализации.
При денормализации влево мантисса сдвигается на один разряд вправо, а порядок увеличивается на 1.
При денормализации вправо мантисса сдвигается влево до появления в старшем разряде 1, при знаке 0, или 0 при знаке 1, а из порядка вычитается количество 1, равное числу сдвигов мантиссы.
Порядок проверки денормализации.
Сначала выполняется проверка, не нарушена ли нормализация влево и, если нарушена, то устраняется. Если нормализация влево не нарушена, то проверяется наличие правой денормализации, и, если она есть, то устраняется. Левая денормализация возможна только на 1 разряд, а правая - на n (количество разрядов, на которое может быть нарушена нормализация вправо, ограничено только длиной разрядной сетки ЭВМ). После выполнения предельного числа сдвигов мантиссу результата представляют машинным нулем. Мантиссу результата представляют также машинным нулем, если в процессе ее сдвига порядок числа окажется меньше допустимого, т.е. абсолютная величина результата будет меньше, чем минимально возможное машинное число.
При сложении может произойти истинное переполнение разрядной сетки числа, т.е. переполнение разрядной сетки порядка. В этом случае минимум одно из слагаемых должно иметь максимальный порядок, а мантисса результата должна получиться денормализованной влево. При этом в ЭВМ формируется признак переполнения порядка.
Пример 1.
[А]пр =0 101 1,10101;
[B]пр =0 011 0,11001; Найти С=А+В
порядок мантисса
[B’]пр =0 101 0,0011001;
[a]д=11,0101100
[b]д=00,0011001
[c]д=11,1000101
Так как мантисса результата денормализована вправо на 1 разряд, то ее необходимо сдвинуть на 1 разряд влево и при этом вычесть из порядка 1.
[С]д=0 100 11,000101; [С]пр=0 100 11,111011;
Пример 2.
[А]пр =0 101 1,10101;
[B]пр =0 100 1,11001; Найти С=А+В