Жмакин А.П. Архитектура ЭВМ (2006), страница 9
Описание файла
Документ из архива "Жмакин А.П. Архитектура ЭВМ (2006)", который расположен в категории "". Всё это находится в предмете "техника и элементная база средств цифровой обработки сигналов (тэбс цос)" из 11 семестр (3 семестр магистратуры), которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. .
Онлайн просмотр документа "Жмакин А.П. Архитектура ЭВМ (2006)"
Текст 9 страницы из документа "Жмакин А.П. Архитектура ЭВМ (2006)"
Рассмотрим несколько примеров
Пример 3.5
Сложить два числа в обратном коде. Результат — на рис. 3.4.
Приведенный пример соответствует рассмотренному выше случаю 2; перенос, возникающий в знаковом разряде, циклически передается в младший разряд предварительного результата.
Пример 3.6
Сложить два числа в обратном коде (случай 3). Результат — на рис. 3.5.
Пример 3.7
Сложить два числа в обратном коде (случай 4). Результат — на рис. 3.6.
Пример 3.8
Сложить два числа в обратном коде (одинаковые модули, но разные знаки). Результат — на рис. 3.7.
Таким образом, ноль в обратном коде бывает "положительный" и "отрицательный" (обратите внимание на выражение (3.17)), причем добавление к числу "отрицательного" нуля, как и "положительного", дает в результате значение первого слагаемого.
Пример 3.9
Сложить два числа в обратном коде: 3 + (-0). Результат — на рис. 3.8.
Теперь рассмотрим случаи, когда |A + B| > 1, что соответствует переполнению разрядной сетки. Очевидно, учитывая, что |а| < 1 и |В| < 1, переполнение
возможно только при сложении чисел с одинаковыми знаками. Рассмотрим примеры.
Пример 3.10
Сложить два числа в обратном коде: 13/16 + 5/16 = 18/16. Результат— на
рис. 3.9
Пример 3.11
Сложить два числа в обратном коде: (—11/16) ч- (—8/16) = (—19/16). Результат— на рис. 3.10.
Таким образом, признаком переполнения в обратном коде можно считать знак результата, противоположный одинаковым знакам слагаемых:
Пример 3.12
Сложить числа в обратном коде (а>в, в>0, |а + в| = 1). Результат — на рис. 3.11.
Пример 3.13
Сложить числа в обратном коде (а<0, в<0, |A + B| = 1). Результат — на рис. 3.12.
Переполнение в соответствии с (3.19) обнаруживается и в этих случаях.
Итак, использование обратного кода в операциях алгебраического сложения/вычитания позволяет:
□ использовать только действие арифметического сложения двоичных кодов;
□ получать истинное значение знака результата, выполняя над знаковыми разрядами операндов те же действия, что и над разрядами чисел;
□ обнаруживать переполнение разрядной сетки.
Еще одним достоинством применения обратного кода можно считать простоту взаимного преобразования прямого и обратного кода.
Однако использование обратного кода имеет один существенный недостаток — коррекция предварительной суммы требует добавления единицы к ее младшему разряду и может вызвать (в некоторых случаях) распространение переноса по всему числу, что, в свою очередь, приводит к увеличению вдвое времени суммирования. Для преодоления этого недостатка можно использовать вместо обратного дополнительный код.
3.6. Дополнительный код
и арифметические операции в нем
Связь между числом и его изображением в дополнительном коде определяется соотношениями
Таким образом, и дополнительный код положительного числа равен самому числу (как обратный и прямой). Дополнительный код отрицательного числа дополняет исходное число до основания системы счисления.
Дополнительный код отрицательного числа образуется в соответствии со следующим выражением:
Таким образом, для преобразования отрицательного двоичного числа в дополнительный код следует преобразовать его сначала в обратный код (установив знаковый разряд в 1 и проинвертировав все остальные разряды числа) и добавить единицу к младшему разряду обратного кода.
Другой способ перевода прямого кода отрицательного двоичного числа в дополнительный (приводящий, разумеется, к такому же результату) определяется следующим правилом: оставить без изменения все младшие нули и одну младшую единицу, остальные разряды (кроме знакового!) проинвертировать.
Пример 3.14
Преобразовать числа в дополнительный код. Результат — на рис. 3.13
3.6.1. Алгебраическое сложение в дополнительном коде
Рассмотрим те же четыре случая сочетания знаков и модулей операндов, что и при рассмотрении сложения в обратном коде в разд. 3.5.1:
□ Случай 1
а>0, в>0, а + в<1
Этот случай соответствует обычному сложению прямых кодов чисел:
[а>0]+[в>0]=а+в.
□ Случай 2.
а>0, в<0, а + в>0.
[а > 0] + [в < 0] = а + 2 + в . Истинное значение результата в рассматриваемом случае (сумма положительна) будет а + в и коррекция заключается в вычитании 2.
□ Случай 3.
а>0, в<0, а + в<0.
[а >0] +[в < O] = а + 2 + в . Этот результат соответствует правильному, поскольку рассматривается случай отрицательной суммы.
□ Случай 4.
а<0, в<0, |а + в|<1.
[а < 0] + [в < 0]= 2 + а + 2 + в . Здесь предварительный результат, как и
в случае 2°, нуждается в коррекции путем вычитания 2, поскольку истинное значение отрицательной суммы, представленной в дополнительном
коде а + в + 2.
Как и в обратном коде, коррекция требуется только в случаях 2 и 4, причем в дополнительном коде коррекция заключается просто в игнорировании переноса, возникающего из знакового разряда.
Рассмотрим несколько примеров.
Пример 3.15
Сложить два числа в дополнительном коде: (+13/16)+ (-3/16) = (+10/16). Результат — на рис. 3.14.
Пример 3.16
Сложить два числа в дополнительном коде (случай 3). Результат рис. 3.15.
Пример 3.17
Сложить два числа в дополнительном коде (случай 4). Результат— на рис. 3.16.
Пример 3.18
Сложить два числа в дополнительном коде (одинаковые модули, но разные знаки). Результат — на рис. 3.17.
Из примера 3.18 видно, что "ноль" в дополнительном коде имеет единственное "положительное" представление.
Теперь рассмотрим случаи, когда |а + в| > 1, что соответствует переполнению разрядной сетки.
Пример 3.19
Сложить два числа в дополнительном коде: 13/16 + 5/16 = 18/16. Результат — на рис. 3.18.
Пример 3.20
Сложить два числа в дополнительном коде: (-11/16) + (-8/16) = (-19/16). Результат — на рис. 3.19.
Очевидно, для дополнительного кода, как и для обратного, справедливо выражение (3.19). Теперь рассмотрим случаи Л + 2я = 1. Для положительных
слагаемых пример 3.12 может относиться как к обратным, так и к дополнительным кодам, но преобразование результата— дополнительного кода в прямой приведет к другому значению. Действительно,
Пример 3.21
Сложить два числа в дополнительном коде: (-11/16) + (-5/16) = (-16/16). Результат — на рис. 3.20.
Переполнение по признакам выражения (3.19) не обнаружено! Однако результат операции — "отрицательный ноль", который не может использоваться
в дополнительном коде. Действительно, сложение в дополнительном коде любого числа с "отрицательным нулем" 1.00...0 меняет знак этого числа. Итак, при а<0, в<0, |а + в|=1 признаком переполнения служит не выражение (3.19), а код результата 1, 00...0.
Таким образом, значение признака переполнения в дополнительном коде можно получить в соответствии со следующим выражением:
Подведем итоги. Применение дополнительного кода, по сравнению с обратным, имеет одно существенное преимущество — коррекция результата сводится просто к отбрасыванию переноса из знакового разряда и не требует дополнительных затрат времени. К недостаткам применения дополнительного кода можно отнести, во-первых, более сложную процедуру взаимного преобразования ПК <-» ДК, требующую дополнительных затрат времени, и, во-вторых, проблемы с обнаружением переполнения. Для того чтобы минимизировать влияние первого недостатка, данные в памяти часто хранят в дополнительном коде. В этом случае преобразования ПК <-> ДК выполняются относительно редко — только при вводе и выводе.
3.6.2. Модифицированные обратный и дополнительный коды
Для определения переполнения используют выражение (3.19)— булеву функцию трех переменных. С целью более удобного обнаружения переполнения в обратном и дополнительном кодах можно применить т. н. "модифицированные" их представления:
Нетрудно показать, что модифицированные коды отличаются от соответствующих обычных наличием дополнительного знакового разряда: "плюс" кодируется 00, а "минус"— 11. Эта своеобразная избыточность, сохраняя все качества обычных обратных и дополнительных кодов, позволяет фиксировать факт переполнения по неравнозначности знаковых разрядов результата. Заметим, что использование модифицированного дополнительного кода не решает проблемы обнаружения переполнения в случаях А < 0, В < 0,
|А + В| = 1.
3.7. Алгоритмы алгебраического сложения в обратном и дополнительном коде
В разд. 3.5.1 и 3.6 подробно обсуждалось, как выполнить операцию алгебраического сложения чисел, уже представленных соответственно в обратном или дополнительном коде. Для этого достаточно выполнить арифметическое сложение двоичных векторов, получив истинное значение результата в коде представления операндов. При операции в обратном коде возникающий из знакового разряда перенос следует добавить к младшему разряду суммы. Переполнение обнаруживается согласно выражению (3.19).
В случае если слагаемые представлены в прямом коде, а операция выполняется в обратном или дополнительном, их следует сначала преобразовать в соответствующий код, затем выполнить сложение и сумму вновь преобразовать в прямой код — код результата всегда должен соответствовать коду исходных данных. На рис. 3.21 приведен пример алгоритма алгебраического сложения в обратном коде чисел, представленных в прямом коде, а на рис. 3.22— алгебраическое сложение/вычитание чисел в дополнительном коде. ,
При рассмотрении алгоритмов использованы те же обозначения, которые были введены в разд. 3.4 для рис. 3.1. Дополнительно введем обозначения: