Модифицированный дополнительный код
Использование модифицированного дополнительного кода связано с проблемой переполнения разрядной сетки. Вычисления в процессоре "классической архитектуры" концептуально производятся параллельно по разрядам операндов и последовательно по операциям. Для большинства микропроцессоров параллельность обработки определяется размером операнда. Это байт (8 бит), слово (2 байта), двойное слово (4 байта) или учетверенное слово (8 байт). Количество байт бит ? параллельной обработки (ширина обработки) определяется разрядностью шин данных, регистров и устройств обработки.
Но в любом случае возможно получение результата операции или цепочки операций, превышающего ширину обработки. Это переполнение разрядов (переполнение разрядной сетки). В процессе работы возможно получение количества бит результата, превышающего ширину обработки. При этом возможно получение неверного результата из-за нехватки разрядов устройства обработки или регистров результата. Для контроля правильности выполнения операций необходим механизм фиксации переполнения.
Рассмотрим несколько примеров выполнения арифметических операций в дополнительном коде над числами А = 0.101(2) = 5(10) и В = 0.110(2) = 6(10).
1. С = А – В = А + (–В)
0.101 + 5(10)
+ 1.010 – 6(10)
1.111 – 1(10) нет переноса, нет переполнения, результат верен.
2. С = В – А = В + (–А)
0.110 + 6(10)
+ 1.011 – 5(10)
1½0.001 + 1(10) есть перенос, нет переполнения, результат верен.
3. С = А + В,
0.101 + 5(10)
+ 0.110 + 6(10)
1.011 – 3(10)), нет переноса, есть переполнение, результат неверен. (должно быть +11(10))
4. С = (–А) + (–В)
1.011 – 5(10)
+ 1.010 – 6(10)
1½0.101 + 5(10) , есть перенос, есть переполнение, результат неверен. (должно быть -11(10))
5. С =(–А) + (–D), где D = 3(10) = 0.011(2)
1.011 – 5(10)
+ 1.101 – 3(10)
1½1.000 – 8(10) есть перенос, переполнения нет, результат верен.
Из приведенных примеров видно что:
· переполнение разрядной сетки (примеры 3 и 4) ведет к ошибке в результате,
· переполнение не всегда совпадает с переносом из старшего разряда,
· для выявления переполнения нужно также анализировать соотношение знаков исходных операндов.
Процедура выявления переполнения разрядной сетки намного упрощается при использовании модифицированного дополнительного кода.
Модифицированный дополнительный код получается из дополнительного простым дублированием знакового разряда. Причем, в памяти числа могут храниться в дополнительном коде и переводиться в модифицированный код непосредственно при пересылке на исполнительное устройство.
Приведенные выше примеры выполнения операций в модифицированном дополнительном коде выглядят так:
1. 00.101 + 5(10)
+ 11.010 – 6(10)
11.111 – 1(10) нет переноса, нет переполнения.
2. 00.110 + 6(10)
+ 11.011 – 5(10)
1½ 00.001 + 1(10) есть перенос, нет переполнения.
3. 00.101 + 5(10)
+ 00.110 + 6(10)
01.011 +11(10), нет переноса, есть переполнение.
4. 11.011 – 5(10)
+ 11.010 – 6(10)
1½10.101 –11(10), есть перенос, есть переполнение.
5. 11.011 – 5(10)
+ 11.101 – 3(10)
1½11.000 – 8(10) есть перенос, нет переполнения.
В дополнительном коде факт переполнения определяется по несовпадению цифр знака. При этом, (даже) в случае переполнения первая цифра знака указывает на верный знак результата, а вторая – на верную старшую цифру результата, не поместившуюся в разрядную сетку значащих цифр результата. Таким образом, правильный результат может быть сохранен для последующей обработки.
Обратный код
Использование обратного кода дает еще одну возможность замены арифметического действия вычитания сложением с инверсией вычитаемого.
Кодирование чисел в обратном коде можно также получить естественным путем при помощи операции вычитания (при моделировании работы вычитающего счетчика).
Для примера рассмотрим работу двоичного счетчика при вычитании, начиная со значения 2(10):
0.010 + 2(10)
0.001 + 1(10)
0.000 + 0(10) ноль
1.111 это значение в обратном коде рассматривается как минус ноль (–0(10))
1.110 –1(10)
1.101 –2(10) и т.д.
В обратном коде определение кода отрицательной величины по коду положительной величины (приписывание отрицательного знака) производится по упрощенному правилу: каждую цифру числа (включая знак) меняют на противоположную. Так как во время счета при переходе счетчика через нулевое значение теряется одна единичка, для корректности вычислений в обратном коде требуется соответствующая компенсация. Для этой цели используется естественный перенос из старшего знакового разряда при переходе счетчика через нулевое значение.
Ниже представлены числа со знаком в обратном коде, которые можно поместить в трехразрядный регистр:
Положительные | Отрицательные | ||||
0.00(2) | + 0(10) | 1.00(2) | – 3 | ||
0.01(2) | + 1(10) | 1.01(2) | – 2 | ||
0.10(2) | + 2(10) | 1.10(2) | – 1 | ||
0.11(2) | + 3(10) | 1.11(2) | – 0 |
Двоичный обратный код полностью симметричен по отношению к множеству положительных и отрицательных чисел.
Примеры выполнения операции вычитания в обратном коде над числами
А=2(10)=0.10(2) и В=1(10)=0.01(2)
1. С=А–В=А+(–В)
0.10 +2(10)
+1.10 –1(10)
1½0.00 сложение
+ 1 коррекция, сложение с единицей переноса
0.01 результат 2(10)–1(10)=1(10).
2. С=В–А=В+(–А)
0.01 +1(10)
+1.01 –2(10)
1.10 результат 1(10)–2(10)=–1(10)
В примере (из меньшего вычитается большее) нет коррекции, но результат верен.
3. С=В–1–1=В+(–1)+(–1). Пример эквивалентен примеру 2, но вычитание двух единиц производится в два этапа.
0.01 +1(10)
+1.10 –1(10)
1.11 –0(10) результат первого вычитания
+1.10 –1(10)
1½1.01 результат второго вычитания без коррекции
+ 1 коррекция, сложение с единицей переноса
1.10 результат 1(10)–2(10)=–1(10).
В приведенных примерах коррекция результата (сложение с единицей переноса) представлена в виде отдельного действия, но на практике коррекция совмещается со сложением. Просто используется суммирующее устройство с циклическим переносом с выхода старшего разряда на вход переносов младшего разряда.
Таким образом, обратный код отличается от дополнительного алгоритмом определения кода отрицательной величины по коду положительной величины и использованием сумматора с циклическим переносом., а реализация арифметических действий в обратном коде предполагает использование сумматора с циклическим переносом.
Для выявления переполнения разрядной сетки применяется модифицированный обратный код.
Модифицированный обратный код, как и дополнительный, получается простым дублированием знакового разряда.
Дополнительный и обратный коды считаются равноценными, но в реальных ЭВМ применяется преимущественно дополнительный код. В ЭВМ числа со знаком могут храниться в памяти в прямом, обратном или в дополнительном кодах, но выполнение арифметических операций, связанных с вычитанием, производится с использованием дополнительного или обратного кодов.
Дата добавления: 2022-02-05; просмотров: 800;