Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СОДЕРЖАНИЕ 3 (2).doc
Скачиваний:
46
Добавлен:
31.08.2019
Размер:
6 Мб
Скачать
☆
      1. Особенности сложения и вычитания в дополнительном коде

В дополнительном коде (варианты B и C) знак результата выполнения любой операции равного нулю всегда плюс (+0). Это следует из способа кодирования 0 в дополнительном коде. При выполнении операций в прямом или обратном коде это не так.

Если код 1|00…0 не применяется для представления числа в дополнительном коде (вариант C), система выполнения арифметических операций должна проверять операнды на этот код до расширения их форматов, и при его обнаружении формировать признак исключительной ситуации невыполнимая операция и сигнал прерывания.

При выполнении операции в формате операндов необходимо формировать сигнал прерывания по переполнению, если код результата 1|00…0, и он не используется для кодирования числа в формате результата. Обработчик прерывания по переполнению при вычислении точного результата должен проверять полученный переполненный код на значение 1|00…0 и приписывать к нему код знака 1 (1|100…0). При иных значениях переполненного кода приписывать код знака инверсный коду старшего значащего разряда. Кроме того, при обработчик должен заменить двоичный код цифры старшего значащего разряда кодом эквивалентным по значению и принятым для кодирования цифр в иных разрядах числа (см. раздел 4.3.1).

Если при сложении дополнительных кодов перенос в младший разряд принять равным 1, количественный эквивалент суммы возрастет на 1 с весом младшего разряда. Это позволяет вычислять , где m – индекс младшего разряда, выполняя одну, а не две операции сложения. В частном случае, когда X, Y – целые и , . Аналогично, при вычитании дополнительных кодов заем 1 из младшего разряда уменьшит количественный эквивалент разности на 1 с весом младшего разряда.

      1. Сложение в обратном коде

Сложение в обратном коде выполняется так же, как и в дополнительном коде, но с той разницей, что перенос из знакового разряда не отбрасывается, а прибавляется к младшему разряду промежуточной суммы. Этот перенос называют циклическим. Результат сложения будет получен в обратном коде.

Сложение с расширением поля значащих разрядов операндов на одну позицию слева.

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

Возможность записи точной суммы в формат результата решит система Записи кодов в формат результата. Для записи в формат результата система Записи выполнит, быть может, округление и/или расширение формата полученного точного результата сложения. Она же сформирует признаки исключительных ситуаций потери точности, потери значимости и переполнения и выдаст, если возникнет необходимость, сигнал прерывания (раздел 3.3).

Пример 4-10. Выполнено сложение двоичных чисел в обратном коде в расширенном формате операндов. Дополнительный разряд целого выделен жирным шрифтом. Переполнения суммы при сложении в расширенном формате произойти не может. Результат вычислен точно.

Пример 4-11. Выполнено сложение восьмеричных чисел в обратном коде в расширенном формате операндов. Результат вычислен точно.

М ожно для экономии двоичных позиций при представлении операндов в двоично-кодированных системах счисления расширять поле целого двоичной позицией, копируя в нее код знака, и выполнять сложение цифр в этой позиции и в позиции знака по правилу сложения двоичных цифр с учетом переноса из предыдущего разряда. Расширение поля целого и замена дополнительного бита кодом цифры при передаче точного результата системе Записи выполняется по правилам, изложенным в разделе 4.3.1 для случая аналогичного кодирования цифры в дополнительной позиции.

Пример 4-12. Здесь операнды представлены в десятичной системе счисления в обратном коде, причем формат операндов в целой части расширен на 1 бит кодом знака. Дополнительный бит целого, выделен жирным шрифтом. В нижней строке приведены результаты, передаваемые системе Записи в формат результата.

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

Замечание 2. Циклический перенос равный 1 не может вызвать распространение переносов дальше старшего значащего разряда и изменить разряд знака промежуточной суммы. Поэтому знак промежуточной суммы является знаком результата. Циклический перенос достаточно прибавлять только к значащим разрядам промежуточной суммы.

Замечание 3. Циклический перенос равный 0 можно не прибавлять к промежуточной сумме и считать, что результатом сложения является промежуточная сумма.

Сложение без расширения поля значащих разрядов операндов на одну позицию слева.

Можно не расширять поле целого, а лишь выравнивать идентичные поля операндов, расширяя меньшее до большего.

Результатом сложения кодов операндов в одинаковом формате без дополнительного значащего разряда целого с циклическим переносом из разряда знака будет обратный код значащих разрядов суммы, вычисленный точно, но без разряда знака. В двоично-кодированных системах счисления старший значащий разряд суммы будет представлен в одном бите подобно тому, как это имеет место в примере 4-12.

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

Знак суммы можно определить разными способами.

  1. Сложить по модулю 2 знаковые разряды операндов и перенос из знакового разряда.

  1. Если знаки операндов совпадают, знак результата равен знаку операндов; иначе – код знака равен старшему разряду промежуточной суммы и совпадающему с ним старшему разряду результата.

  1. Если при вычислении промежуточной суммы перенос из разряда знака не совпадает с переносом в разряд знака, знак результирующей суммы совпадает со знаком любого операнда; иначе – код знака результирующей суммы равен старшему разряду промежуточной суммы и совпадающему с ним старшему разряду результата.

  1. Если при вычислении промежуточной суммы перенос из разряда знака совпадает с переносом в разряд знака, код знака результирующей суммы равен старшему разряду промежуточной суммы; иначе – инверсии старшего разряда промежуточной суммы.

Комментарий к правилу 1.

По этому правилу вычисляется знак точной суммы в расширенном формате операндов.

Комментарий к правилу 2.

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

Комментарий к правилу 3.

Если переносы не совпадают, то знаки операндов одинаковые и знак суммы совпадает со знаком любого операнда.

Если переносы совпадают, то знаки операндов могут совпадать или не совпадать. При несовпадении знаков код знака суммы равен ее старшему значащему разряду.

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

Комментарий к правилу 4.

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

При несовпадении переносов знаки операндов совпадают. Если коды знаков равны 0, то циклический перенос 0, и при переносе 1 в разряд знака старший разряд промежуточной суммы 1, а код знака суммы 0. Если коды знаков равны 1, то циклический перенос 1, и при переносе 0 в разряд знака старший разряд промежуточной суммы 0, а код знака суммы 1.

В следующих примерах выполнено сложение обратных кодов без расширения формата.

Пример 4-13. Операнды в обратном двоичном коде. Обратный код суммы вычислен точно. Знак результата определен по одному из приведенных выше правил.

П ример 4-14. Операнды в обратном десятичном коде. Обратный код суммы вычислен точно. Знак результата определен по одному из приведенных выше правил.

Старший значащий разряд суммы, выделенный жирным шрифтом, представлен одним битом как в примере 4-12. При пересылке результата системе Записи код старшего разряда суммы должен быть изменен по правилам, изложенным в разделе 4.3.1 для случая аналогичного кодирования цифры в дополнительной позиции. В нижней строке вариантов примера приведено значение кода пересылаемого системе Записи в формат результата.

Проявление ситуации переполнения суммой формата слагаемых.

Если сумма должна быть загружена в формат операндов, то возможна исключительная ситуация переполнения формата. Для ускорения вычислений можно проявить эту ситуацию и формировать признак R переполнения формата в процессе сложения до записи суммы в формат результата. Для этого можно выполнять сложение, не расширяя формат операндов и суммы, и считать, что старший разряд суммы является разрядом знака.

Признаки переполнения следующие.

  1. Знаки операндов совпадают, а знак суммы иной.

  1. Операнды положительные и перенос в знаковый разряд при вычислении промежуточной суммы 1, или операнды отрицательные и оба переноса в знаковый разряд равны 0.

  1. Циклический перенос не совпадает с переносами в знаковый разряд при вычислении промежуточной суммы и при ее сложении с циклическим переносом.

Комментарий к правилу 2.

Если код знака операндов 0, то циклический перенос равен 0 и не может изменить промежуточную сумму. Код знака результата будет 1 (переполнение), если перенос в знаковый разряд при вычислении промежуточной суммы 1.

Если код знака операндов 1, то оба переноса в знаковый разряд равные 0 сохранят код знак суммы равный 0 (переполнение). Оба переноса в знаковый разряд не могут быть равными 1.

Комментарий к правилу 3.

При разных знаках операндов циклический перенос всегда совпадает с переносом в знаковый разряд при вычислении промежуточной суммы. Поэтому при разных знаках операндов признак переполнения будет равен 0. Если код знака операндов 0, то циклический перенос равен 0. Не совпадающий с ним перенос в знаковый разряд равный 1 установит разряд знака суммы в 1 (переполнение). Если код знака операндов 1, то циклический перенос равен 1. Не совпадающие с ним переносы в знаковый разряд при вычислении промежуточной суммы и при ее сложении с циклическим переносом равные 0 сохранят разряд знака суммы равным 0 (переполнение).