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

Рассмотрим способы сложения при представлении операндов в дополнительном коде (вариант B) в одинаковых форматах. Особенности сложения в дополнительных кодах в вариантах A и C оговорим отдельно.

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

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

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

В табл.4.1 приведены результаты сложения двоичных цифр с учетом переноса из предыдущего разряда.

Таблица 4.1

i bi сi

si сi+1

0 0 0

0 0 1

0 1 0

0 1 1

1 0 0

1 0 1

1 1 0

1 1 1

0 0

1 0

1 0

0 1

1 0

0 1

0 1

1 1

Здесь

  • и – цифры слагаемых в разряде ;

  • – значение переноса в разряд ;

  • – значение суммы в разряде ;

  • – значение переноса в последующий разряд.

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

Пусть операнды – десятичные числа –231,15 и +215,04. Их сумма равна –16,11. Дополнительные коды операндов и суммы в расширенном формате с длиной поля целого 4 позиции и поля дробной части 2 позиции соответственно равны 1|9768|85 0|0215|04 и 1|9983|89. Цифры в дополнительной позиции, расширяющей формат, показаны жирным шрифтом. Выполним сложение в дополнительном коде. Знаковые разряды суммируются по правилам сложения в двоичной системе счисления. Зачеркнутые переносы 0 или 1 означают, что цифры отбрасываются или не вычисляются.

П

Переносы: 1 1 0111 1

1|9768|85 (–231,15)

+ 1|9184|96 (–815,04)

Дополнительный код суммы: 1|8953|81 (–1046,19)

Переносы: 0 0 0010 0

1|9768|85 (–231,15)

+ 0|0215|04 (+215,04)

Дополнительный код суммы: 1|9983|89 (–16,11)

усть десятичные операнды равны –231,15 и –815,04. Их сумма равна –1046,19. Дополнительные коды операндов и суммы в расширенном формате: 1976885 1918496 1895381. Выполним сложение дополнительных кодов слагаемых:

Пусть дополнительные коды обеих десятичных операндов до расширения форматов 1|00|000 (-100,00010). Тогда после расширения форматов их коды 1|900|000. Выполним сложение операндов в расширенном формате.

Переносы: 1 1 000 00

1|900|000 (–100,000)

+ 1|900|000 (–100,000)

Дополнительный код суммы: 1|800|000 (–200,000)

Пример 4-1. Выполнено сложение двоичных чисел в дополнительном коде после расширения их форматов. Дополнительные разряды выделены жирным шрифтом.

При сложении восьмеричных или шестнадцатеричных чисел следует пользоваться таблицами сложения цифр в этих системах счисления или следующим правилом.

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

Например, в восьмеричной системе счисления 3+2+0=5 и перенос равен 0. Сумма 4+6+1=3 и перенос равен 1, так как количественный эквивалент суммы 4+6+1>7 (4+6+1=1110), а количественный эквивалент единицы переноса в восьмеричной системе счисления равен 810, то 11 – 8 =3.

A B C

Перенос: 00 1101111 11 11 1100001 11 11 0011101 01

0|0010111|011 (+233/8) 1|1111001|101 (–63/8) 1|1000110|101 (–573/8)

+ 0|0110011|101 (+515/8) + 0|0110001|011 (+493/8) + 1|1001110|101 (–493/8)

0|1001011|000 (+75) 0|0101011|000 (+43) 1|0010101|010 (–1066/8)

В шестнадцатеричной системе счисления 4+6+0=A (А имеет количественный эквивалент 1010) и перенос равен 0. Сумма 4+А+1=F (F=1510) и перенос равен 0. Сумма А+А+0=4 и перенос равен 1, так как вес переноса 1610, а А+А=2010, то 2010 – 1610= 4.

A B C D

00 001 01 10 1 11 111 11 000

0|027|6 (+396/16) 1|FF9|A (–66/16) 1|F8E|A (–1136/16) 1|F00|0 (–256)

+ 0|053|A (+8310/16) + 0|0 71|6 (+1136/16) + 1|F8E|A (–1136/16) + 1|F00|0 (–256)

0|07B|0 (+123) 0|06B|0 (+107) 1|F1D|4 (–22612/16) 1|E00|0 (–512)

1|0 E 2|Cпр 1| 100|0пр

Пример 4-2. Выполнено сложение шестнадцатеричных чисел в дополнительных кодах после расширения формата операндов.

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

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

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

  • при положительном знаке результата: 0 – кодом цифры 0; 1 – кодом цифры 1;

  • при отрицательном знаке результата: 0 – кодом цифры на 1 меньшей максимальной цифры системы счисления; 1 – кодом максимальной цифры.

Этот способ позволяет уменьшить затраты оборудования на представление дополнительного разряда в двоично-кодированных системах счисления в процессе сложения и сократить длину пробега переноса.

Выполнение операции при расширении поля операндов одним битом рассмотрим на примерах.

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

В варианте F выполняется сложение дополнительных кодов минимальных целых десятичных чисел представленных в формате с тремя позициями целого до его расширения.

A B C D E F

00 011 00 101 11 111 00 001 11 101 11 000

0|027|6 0|097|6 0|097|6 0|071|6 1|172|4 (–27,6) 1|1000 (–1000)

+0|053|4 +0|071|6 +1|128|4 (–71,6) +1|102|4 (–97,6) +1|146|6 (–53,4) +1|1000 (–1000)

0|081|0 0|169|2 0|026|0 1|174|0 1|119|0 1|0000

0|081|0 0|169|2 0|026|0 1|974|0 (–26,0) 1|919|0 (–81,0) 1|8000 (–2000)

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

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

  • как дополнительный код значащих разрядов точной суммы без разряда знака;

  • как дополнительный код суммы со знаком в формате операндов, но возможно переполненный.

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

Во втором случае следует вычислить признак R переполнения формата и при переполнении сформировать сигнал прерывания.

Действительно, при расширении кода операндов их знаковые разряды копируются в дополнительный бит поля значащих разрядов (примеры 4-1 и 4-3). Если дополнительный бит отсутствует, то можно считать, что его функцию выполняет бит знака. Следовательно, все значащие разряды, включая дополнительный разряд, вычислены точно, а знак суммы не вычислен.

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

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

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

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

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

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

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

П

A B С D E F

0 1 100 1 0 000 11 000 0 0 100 1 1 000 1 0 000

0|0111 (+7) 1|1001 (-7) 1|1001 (-7) 1|0100 (-12) 1|1000 (-8) 1|0000 (-16)

+ 0|1100 (+12) +1|0100 (-12) +0|1100 (+12) +0|0111 ( +7) +1|1000 (-8) +1|0000 (-16)

0|1 0011 (+19) 1|0 1101 (-19) 0|0 0101(+5) 1|1 1011(-5) 1|1 0000 (-16) 1|0 0000 (-32)

G H I J K L

0 1 00 1 0 00 1 1 00 0 0 00 1 0 00 1 0 00

0|140 1|860 (-140) 1|860 (-140) 1|100 (-900) 1|100 (-900) 1|000 (-1000)

+ 0|900 +1|100 (-900) + 0|900 (+900) + 0|140 (+140) + 1|100 +1|327 (-673)

0|1 040 1|0 960 0|0 760 1|1 240 1|0 200 1|0 327

0|1 040 1|8960 (-1040) 0|0760 (+760) 1|9240 (-760) 1|8200 (-1800) 1|8327 (-1673)

ример 4-4
. Выполнено сложение в дополнительном коде без расширения поля целого операндов. Принято, что код 1|00…0 применяется для кодирования числа .

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

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

В практике конструирования вычислителей часто встречается случай, когда операнды и результат операции должны быть представлены в одинаковых форматах. При выполнении операции сложения разрядность точной суммы может превысить разрядность операндов на один старший значащий разряд целого и не уместиться в формат операндов. Конечно, эта ситуация будет обнаружена системой Записи точной суммы в формат результата, которая сформирует признак исключительной ситуации переполнения формата и выдаст сигнал прерывания. Для ускорения вычислений целесообразно выполнять сложение в формате операндов и считать, что старший разряд суммы является разрядом знака. В процессе сложения проявлять признак R исключительной ситуации переполнения формата результата, и если R=1, формировать сигнал прерывания до передачи результата системе Записи.

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

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

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

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

  1. Перенос в разряд знака не совпадает с переносом из разряда знака.

Вычисление признака R переполнения формата по правилу 2 выполняется одновременно с вычислением знака суммы и переноса из разряда знака, а поэтому раньше, чем по правилам 1 и 3.

Вычисление признака переполнения по правилу 3 проще, чем по правилам 1 и 2, так как функция переполнения по правилу 3 зависит от двух переменных, а по правилам 1 и 2 от трех переменных.

Справедливость правила 1 очевидна. Правило 2 вытекает из правила 1. Действительно. При кодах 0 знаков операндов перенос 1 в разряд знака делает разряд знака суммы равным 1. При кодах знаков операндов 1 перенос 0 в разряд знака сохраняет сумму знаковых разрядов равной нулю.

Справедливость правила 3 вытекает из анализа табл.4.2 сложения знаковых разрядов an, bn и переноса cn в знаковый разряд. Здесь R – признак переполнения формата. Сопоставьте колонки, выделенные жирным шрифтом.

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

Пример 4-5. Выполнено сложение в дополнительном коде с вычислением суммы в формате операндов с проверкой переполнения формата. Принято, что код 1|00…0 применяется для кодирования числа.

В вариантах A-E суммируются двоичные коды чисел, в вариантах F, P и R – десятичные, в вариантах G-O – шестнадцатеричные. Признак R переполнения суммой формата операндов определен по одному из трех приведенных выше правил. Читатель может проверить правильность определения переполнения по любому из правил.

В ситуации переполнения R=1 и сформирован сигнал прерывания. В нижних строках вариантов примера приведено точное значение суммы, вычисленное обработчиком прерывания при R=1 по приведенным выше правилам определения дополнительного разряда и знака точной суммы описанным выше. Читатель может убедиться в справедливости правил на этих примерах.

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

A B C D E F

P=2 P=2 P=2 P=2 P=2 P=10

0 1 100 10 000 11 100 10 000 11 111 11 1

0|0111 ( +7) 1|1001 ( -7) 1|1100 ( -4) 1|0000 (-16) 0|1111 (+15) 1|39 (-61)

+ 0|1100 (+12) +1|0100 (-12) + 1|0100 (-12) + 1|0000 (-16) + 1|1111 (-1) + 1|61 (-39)

1|0011 (-13) 0|1101 (+13) 1|0000 (-16) 0|0000 (+0) 0|1110 (-14) 1|00 (-100)

R=1 R=1 R=0 R=1 R=0 R=0

0|10011 (+19) 1|01101 (-19) 1|00000 (-32)

G L M N O P R

P=16 P=16 P=16 P=16 P=16 P=10 P=10

0 1 0 1 0 1 11 1 10 0 01 1 01 1 10 0

0|B9 (+185) 1|47 (-185) 1|79 (-135) 1|00 (-256) 0|FF (+255) 0|87 (+87) 1|13 (-87)

+ 0|7 2 (+114) +1|8E (-114) +1|87 (-121) +1|01 (-255) +0|FF (+255) +0|25 (+25) +1|75 (-25)

1|2B (-213) 0|D5 (+213) 1|00 (-256) 0|01 (+1) 1|FE (-2) 1|12 (-88) 0|88 (+88)

R=1 R=1 R=0 R=1 R=1 R=1 R=1

0|12B (+299) 1|ED5 (-299) 1|E01(-511) 0|1FE(+510) 0|112 (+112) 1|888 (-112)

как код 1|00…0 не является числом.

В вариантах C, F, M признак переполнения формата примет значение R=1, так как код суммы будет проверен на значение 1|00…0 не применяемое для кодирования числа. Обработчик прерывания и в этом случае вычислит точное значение суммы.

Если дополнительный код 1|00…0 кодирует число (-0) (вариант A), то операнды проверяют на наличие нулей в значащих разрядах кода. Если один из операндов 0, результат равен другому операнду. Если оба операнда нули и коды их знаков 1, результат равен 1|00…0 (-0). Иначе 0|00…0 (+0). Если оба операнда не равны 0, выполняют сложение, причем сумма операндов с разными знаками равных по модулю будет +0. Если сумма отрицательных операндов 1|00…0, то сложилась ситуация переполнения (см. варианты C,F,M примера 4-5).