КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Вычитание на основе дополнительного кода
Операции двоичного сложения и вычитания с использованием дополнительного и обратного кодов Рассмотрим в общем виде правила выполнения операций сложения и вычитания для чисел с фиксированной запятой на основе дополнительного и обратного кодов, а также методы оценки результатов. Пусть надо найти (действия выполняются над модулями чисел): S=A+B; |A|<1; |B|<1; A>0; B<0. Тогда S= A - |B|; Будем вычислять сумму модулей в виде S* = [A]п + [-|В|]д = A+10 -|B|=10+(A - |B|) (1.5) Рассмотрим два возможных случая: 1) А - |B| ≥0, тогда S* ≥0; S*≥10 Поскольку разрядная сетка рассчитана на размещение чисел по модулю меньших 1, то слагаемое “10” образует перенос из старшего разряда P0=1, который выходит за пределы разрядной сетки. При этом в разрядной сетке окажется сумма в прямом коде, т.е. [S]п = S* - 10 = A - |B| Следовательно, наличие переноса из старшего разряда сумматора является признаком того, что сумма положительна и получилась в прямом коде. 2) Если в выражении (2.1) принять (А - |B|) < 0, то S* < 10, S<0 и по определению (1.3) оказывается, что S* = [A- |B|]д. Следовательно, отсутствие переноса из старшего разряда сумматора является признаком того, что сумма получилась в дополнительном коде. Рассмотрим для иллюстрации несколько примеров. Пример 1: S = A+B; A=.11011; B= -.00101 [-|В|]д =.11011. S* = |A| + [-|В|]д =.11011 .11011 S*=1.10110 S*>1. В этом примере за пределы разрядной сетки вышла единица переноса Р0 = 1, следовательно, результат получился положительный и в прямом коде S = [S]п = 0.10110. Пример 2: S=A+B; A= -.11001 [A]д = 1.00111 B=.00101 S*=[|A| ]д + [|B| ]п.00111 + .00101 S* =.01100 В этом примере перенос из старшего разряда отсутствует, т.е. Р0 = 0, следовательно, результат отрицательный и получился в дополнительном коде, S* = [S]д. 1.3.2 Вычитание на основе обратного кода Остановимся на особенностях выполнения операций сложения и вычитания на основе обратного кода. Будем вычислять (действия выполняются над модулями чисел): S = A+B; |A| < 1; |B| < 1; A > 0; B < 0. Найдем решение в виде: S* = A + [-|B|]o = A + 10 - |B| - 10-n = 10+(A - |B|) - 10-n (1.6) Оценим возможные варианты решения: 1) Если А - |B| ≥ 0, то S* ≥ 10 Анализ выражения (1.6) показывает, что так как “10” образуется за счет переноса из старшего разряда Р0 = 1, то в разрядной сетке остается выражение (А - |B|) - 10-n. Следовательно, для получения правильного результата, если Р0 = 1, необходимо добавить к полученной сумме единицу младшего разряда: |S| = (A - |B|) - 10-n +10-n = A - |B| Эта процедура носит название “циклический перенос”, так как при возникновении переноса из старшего разряда Р0 = 1 именно этот сигнал должен поступать на вход переноса младшего разряда сумматора для коррекции результата. При этом результат получается положительным и в прямом коде. 2) Если А - |B| < 0, то выражение (1.6) представляет собой по определению обратный код искомой разности. При этом S* < 10,переноса из старшего разряда не возникает Р0 = 0, результат отрицательный S<0, S* = [|S|]o Пример 1 S=A+B; A=.11011 B= -.00101 S*= |A| + [- |B| ]о =.11011 + .11010 1.10101 так как Р0 = 1, то выполняется + .00001 циклический перенос |S| =.10110 ЗНS = ЗНА [S]п = 0.10100 Пример 2 S=A - B; A=.00101. B=.11001 S*= |A| + [- |B| ]о =.00101 + .00110 S*=.01011 Поскольку переноса из старшего разряда нет (Р0 = 0), то результат отрицательный и получился в обратном коде. Следовательно, S*=[|S|]о; [S]о = 1.01011 [S]п = 1.10100 Рассмотрим еще один пример, в котором представляется вариант с переполнением сетки S=A + B; A=.11011 B=.01001 S*= |A| + |B| =.11011 + .01001 S*=1.00100 На основе приведенных выше способов оценки результат должен получиться отрицательным, так как Р0 = 0, да и в знаковом разряде также стоит “1”. Однако сумма положительна, но |S*|>1 т.е. произошло переполнение разрядной сетки. Следовательно, для обнаружения такой ситуации должны быть использованы дополнительные логические условия.
Дата добавления: 2015-05-09; Просмотров: 450; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |