Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Контрольная по ЭВМ / 2_МУ_Орг-слож-выч.doc
Скачиваний:
15
Добавлен:
20.02.2016
Размер:
81.92 Кб
Скачать
    1. Знаковые целые числа

2.4.1 Сложение и вычитание знаковых чисел

Сложение и вычитание знаковых чисел производится по соответствующим алгоритмам для беззнаковых чисел. При этом дополнительные коды знаковых операндов рассматривают как числа без знака, и в таком виде их складывают или вычитают, а полученный результат затем рассматривают как дополнительный код знакового ответа.

Если результат операции со знаковыми числами не верен в математическом смысле, то флаг переполнения OF получает значение 1, и значение 0 – если результат правильный.

ПРИМЕР

Сложить байтовые числа +3 и (-1).

Получаем дополнительные коды чисел, это соответственно 3 и ( 256 - 1) = 255.

Складываем коды по правилам для беззнаковых чисел.

Сумма кодов 3 + 255 больше 255, то есть результат не вмещается в байт. Следовательно, бит номер 8 «теряется», а это приводит к уменьшению суммы на 256. За результат сложения кодов принимается число ( 3 + 255 ) – 256 = 2. Факт того, что был перенос фиксируется флагом CF = 1 (коды – числа беззнаковые!!! ).

Полученная величина 2 рассматривается как дополнительный код результата. В соответствии с п.2.2.2 искомая сумма равна +2.

Результат правильный, следовательно, флаг OF равен 0.

ПРИМЕР

Сложить байтовые числа ( -3 ) и +1.

Дополнительные коды этих чисел: ( 256 – 3 ) =253 и 1.

Складываем дополнительные коды как беззнаковые числа: 253 +1 = 254. Полученная сумма меньше 255 (ей «хватает» байта), значит флаг CF равен 0.

Рассматривая полученную величину как дополнительный код ответа, определяем соответствующее ему число: так как 254 > 127, то, в соответствии с п. 2.2.2, искомое число отрицательно, а его абсолютная величина рассчитывается по формуле: 256 - 254 = 2, таким образом, число равно -2.

Результат правильный, следовательно, флаг OF равен 0.

    1. Возможные проблемы

Напомним, что при размере ячеек в 8 бит в дополнительном коде представляются только числа от -128 до +127.

Рассмотрим, к примеру, сложение знаковых байтовых чисел +127 и +2. Их дополнительные коды - беззнаковые числа 127 и 2, сумма кодов равна 129 – это код результата. Определяем знаковое число по его дополнительному коду. Так как 129 > 127, то модуль числа равен 256 – 129 = 127, а само число -127. Таким образом, при сложении двух положительных чисел получено отрицательное число!

Это произошло потому, что при представлении чисел в дополнительном коде левый разряд является знаковым, а на размещение самого числа ( на так называемую мантиссу числа) отводятся, в случае байта, оставшиеся 7 правых разрядов. Самое большое число, которое можно разместить на семи позициях, это 1111111(2), то есть, 27 – 1 = 127 (10). В примере получился ответ 129, в двоичном представлении это 1000 000l (2). Восьмиразрядной мантиссе числа не хватило отведенных 7 разрядов, она "залезла" в знаковый разряд, изменив его на противоположный.

Такое «налезание» мантиссы ( цифровой части) числа на знаковый разряд называют "переполнением мантиссы".

Переполнение мантиссы фиксируется во флаге переполнения OF: он получает значение 1, если было переполнение (результат неправильный), и значение 0 – в противном случае (результат правильный).

Переполнение мантиссы возможно и при вычитании. Например, требуется вычислить (+127 ) - (-2 ).

Определяем дополнительные коды:

доп (+127) = 127

доп (-2) = 256 - 2 = 254

Так как уменьшаемое 127 меньше вычитаемого 254, выполняется заем:

(127 + 256 ) – 254 = 129,

при этом флаг CF = 1 (коды – беззнаковые числа).

Устанавливаем число по его коду. Так как 129 > 127, то модуль числа равен 256 – 129 = 127, а само число -127.

Это число и выдается как результат вычитания, хотя истинной разностью является число +129. Настоящая разность оказалась вне диапазона представимых знаковых чисел. Факт переполнения мантиссы фиксируется во флаге OF , равном 1.

Соседние файлы в папке Контрольная по ЭВМ