Сложение двоичных чисел со знаком


На самом деле микропроцессор «не подозревает» о различии между числами со знаком и без знака. Вместо этого у него есть средства фиксирования возникновения характерных ситуаций, складывающихся в процессе вычислений. Некоторые из них мы рассмотрели при обсуждении сложения чисел без знака:

1) флаг переноса cf, установка которого в 1 говорит о том, что произошел выход за пределы разрядности операндов;

2) команду adc, которая учитывает возможность такого выхода (перенос из младшего разряда).

Другое средство – это регистрация состояния старшего (знакового) разряда операнда, которое осуществляется с помощью флага переполнения of в регистре EFLAGS (бит 11).

Вы, конечно, помните, как представляются числа в компьютере: положительные – в двоичном коде, отрицательные – в дополнительном коде. Рассмотрим различные варианты сложения чисел. Примеры призваны показать поведение двух старших битов операндов и правильность результата операции сложения.

 

Пример

30566 = 0111011101100110

+

00687 = 00000010 10101111

=

31253 = 01111010 00010101

Следим за переносами из 14 и 15-го разрядов и правильностью результата: переносов нет, результат правильный.

 

Пример

30566 = 0111011101100110

+

30566 = 0111011101100110

=

1132 = 11101110 11001100

Произошел перенос из 14-го разряда; из 15-го разряда переноса нет. Результат неправильный, так как имеется переполнение – значение числа получилось больше, чем то, которое может иметь 16-битное число со знаком (+32 767).

 

Пример

-30566 = 10001000 10011010

+

-04875 = 11101100 11110101

=

-35441 = 01110101 10001111

Произошел перенос из 15-го разряда, из 14-го разряда нет переноса. Результат неправильный, так как вместо отрицательного числа получилось положительное (в старшем бите находится 0).

 

Пример

-4875 = 11101100 11110101

+

-4875 = 11101100 11110101

=

09750 = 11011001 11101010

Есть переносы из 14 и 15-го разрядов. Результат правильный.

 

Таким образом, мы исследовали все случаи и выяснили, что ситуация переполнения (установка флага OF в 1) происходит при переносе:

1) из 14-го разряда (для положительных чисел со знаком);

2) из 15-го разряда (для отрицательных чисел).

И наоборот, переполнения не происходит (т. е. флаг OF сбрасывается в 0), если есть перенос из обоих разрядов или перенос отсутствует в обоих разрядах.

Итак, переполнение регистрируется с помощью флага переполнения of. Дополнительно к флагу of при переносе из старшего разряда устанавливается в 1 и флаг переноса CF Так как микропроцессор не знает о существовании чисел со знаком и без знака, то вся ответственность за правильность действий с получившимися числами ложится на программиста. Проанализировать флаги CF и OF можно командами условного перехода JC\JNC и JO\JNO соответственно.

Что же касается команд сложения чисел со знаком, то они те же, что и для чисел без знака.

 



Дата добавления: 2021-09-25; просмотров: 390;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.007 сек.