
- •Глава I. Организация вычислений в эвм
- •1. Позиционные системы счисления
- •2. Алгоритмы перевода чисел из одной системы счисления в другую
- •3. Формы представления чисел в двоичной системе счисления
- •4. Операции сложения чисел в прямом, обратном и дополнительном кодах с фиксированной запятой
- •4.2. Умножение чисел в дополнительных кодах
- •4.3. Операция умножения над обратными кодами сомножителей
- •4.6. Выполнение операции сложения над числами с плавающей запятой
- •5. Форматы данных
- •6. Стадии выполнения команды и способы адресации
4. Операции сложения чисел в прямом, обратном и дополнительном кодах с фиксированной запятой
Для выполнения арифметических операций над двоичными числами в ЭВМ могут использоваться прямой, обратный или дополнительный код. Прямой код Хпр числа Х = хm xm-1... x0 x-1 x-n с учетом знака S можно определить из выражения
[Х]пр = S.X.
Если в ЭВМ модуль числа представлен с фиксированной запятой, то Хпр или целое, или дробное. Так, число Х = 1101101,11 в прямом коде может иметь два вида: как целое или дробное (с масштабным коэффициентом 2+7) в разрядной сетке 1 байт 0.1101101 или 1.1101101 (число отрицательное). В зависимости от масштабного коэффициента и разрядности сетки часть разрядов мантиссы любого числа может теряться. Нуль в прямом коде допускается двух видов: 0.0...0 или 1.0...0. В прямом коде легко выполнять операции ввода чисел, умножения и сложения с одинаковыми знаками слагаемых. Однако операции вычитание и деление без изменения схемы сумматора проще реализуются с использованием обратных [Х]0 или дополнительных [X]Д кодов. Обратный и дополнительный коды можно получить по формулам
пр
пр
,
где m и n -номера позиций старшего и младшего разряда. В зависимости от положения запятой, если числа целые, то n = 0, а если дробные, то m = 0.
Из формул получения [Х]0 и [Х]Д видно, что прямой, обратный и дополнительный коды положительного числа совпадают. Обратный код отрицательного числа можно получить путем инверсии разрядов мантиссы
так как равенство
подтверждается сложением
.
Отсюда справедливо также равенство
пр
Если к обратному коду отрицательного числа прибавить единицу в младший разряд (+2-n), получим дополнительный код
Д
Справедливо также равенство
Д
Д
пр
Представим числа Х1 = +125(10), Х2 = -5,5(10) с фиксированной запятой после младшего разряда в разрядной сетке 1 байт в двоичной СС в прямом, обратном и дополнительном кодах:
пр
Д
пр
Д
Сложим числа Х1 иХ2 в 2СС с фиксированной запятой в прямом (а), обратном (б) и дополнительном (в) кодах:
а) |
|
+ |
.1111101 |
|
б) |
+ |
0.1111101 |
|
в) |
|
+ |
0.1111101 |
|
|
|
.0000101 |
|
|
1.1111010 |
|
|
|
1.1111011 |
| |||
|
1 |
|
.0000010 |
|
|
|
0.1110111 |
|
|
1 |
|
0.1111000 |
|
|
|
|
|
|
|
|
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
0.1111000 |
|
|
|
|
|
|
Из примеров сложения видно, что при сложении чисел в прямом, обратном и дополнительном коде результат получается в этих кодах. В прямом коде числа складываются без знака (в примере +125+5), если знаки разные, то операция не выполняется, наличие переноса в знаковый разряд (пример (а)) указывает на переполнение разрядной сетки. В обратном и дополнительном кодах числа складываются со знаками. Перенос из знакового разряда в дополнительном коде отбрасывается, а в обратном коде распространяется в сторону младшего разряда (цепь циклического переноса).
Недостатком обратного кода является двоякое представление нуля 0.0... 0 и 1.1... 1, а также увеличение времени сложения за счет распространения циклического переноса. В дополнительном коде нуль представлен только 0.0... 0, отсутствует циклический перенос и корректировка результата сложения заключается в простом отбрасывании переноса из знакового разряда. Однако для получения дополнительного кода отрицательного числа требуется не только инвертирование разрядов числа, которое заменяется в АЛУ передачей с обратных выходов триггеров регистра, но и прибавление единицы к младшему разряду в сумматоре. Недостатком сложения в обратном и дополнительном кодах является трудность определения переполнения разрядной сетки (ПП), которое определяется вычислением функции
ПП,
где x3,y3,z3 - знаки слагаемых и результата соответственно. Знаки слагаемых x3,y3 могут стираться после выполнения операции в одно- или двухадресных командах. Для устранения этого недостатка при сложении чисел с одинаковыми знаками могут использоваться модифицированные обратный и дополнительный коды. В них для представления числа используют два одинаковых знаковых разряда 00.(+) или 11.(-). Если после сложения по тем же правилам в знаковых разрядах окажется 00. или 11., то результат правильный, соответственно, положительный или отрицательный, а если 10. или 01., то необходимо фиксировать переполнение разрядной сетки. Эти результаты при сложении в модифицированном дополнительном коде можно пояснить примерами
-
00.111110
11.110011
00.000111
00.100010
01.000101
(ПП)
1
00.010101
(нет ПП).
Заметим, что при сложении чисел в обратном и дополнительном кодах с разными знаками переполнения не происходит.
4.1. Операция умножения чисел с фиксированной запятой в прямых кодах
Ч
пр
пр
пр
пр
[
пр
пр
пр[Y]пр=z3.z-1,z-2,
...z-n.
В дальнейшем, чтобы упростить написание формул, отрицательные индексы опускаются.
Операция выполняется в два этапа. Отдельно определяется знак произведения z3 с учетом знаков сомножителей x3 и y3 в соответствии с выражением:
z3
=
x3
y3.
Затем определяется цифровая часть произведения мантисс сомножителей. С этой целью процесс умножения можно представить в следующем виде
Z=ХY=Х(y12-1+y2 2-2+ ...+y(n-1)2-n+1+y(n) 2-n) = |
(1). |
= Х2-1 y1+Х 2-2y2 + ... +Х 2-n+1 y(n-1)+X 2-ny(n). |
Это выражение после преобразования можно представить в виде:
Z= ((...(( 0 +Xy(n)) 2-1 +Xy(n-1)) 2-1 +... +Xy2) 2-1 +Xy1) 2-1 |
(2). |
Полученные выражения (1, 2) являются аналитическими записями двух основных способов умножения: со старших разрядов множителя (1) и младших разрядов множителя (2).
Согласно выражению (2) при умножении с младших разрядов должна выполняться следующая последовательность микроопераций:
- анализируется младшая цифра множителя. Если yn= 1, то множимое Х участвует в формировании цифровой части произведения; если yn = 0, то Х не участвует в формировании произведения;
- полученное первое частичное произведение, равное 0+Xyn, сдвигается на один разряд вправо, то есть умножается на 2-1. Указанная последовательность действий справедлива при умножении на все последующие разряды. Так, при умножении на разряд y(n-1):
- анализируется
цифра множителя yn-1.
Если yn-1= 1, то множимое
прибавляется к сдвинутому первому
частичному произведению, т.е. A2
= (0 + Xyn)
2-1
+ X1.
Если yn-1=0,
то множимое не участвует в формировании
произведения, т.е.
A2 = (0 +
Xyn)·2-1
+ X0.
Полученное второе частичное произведение сдвигается на один разряд вправо. Указанную процедуру умножения можно описать следующей рекуррентной формулой:
A(i) = A(i-1) · 2-1 + y(n+1-i) · Х |
(3). |
Для выполнения умножения необходимо повторить n тактов (i=1,2,..,n) в соответствии с формулой (3) и в заключение осуществить последний n-й сдвиг A(n)2-1 = XY = Z. Отметим, что при перемножении n-разрядных чисел получается 2n-разрядное произведение (n старших разрядов и n младших). При этом получение только n старших разрядов произведения или всех 2n разрядов обеспечивается суммированием в n-разрядном сумматоре. Время умножения равно:
Тх = (tSM+ tСД) · n, где tSM - время суммирования; tСД - время сдвига.
Согласно выражению (1) умножение со старших разрядов множителя должно выполняться в следующей последовательности:
- множимое сдвигается на 1 разряд вправо, т.е. X·2-1;
- анализируется старшая цифра множителя y1. Если y1 = 1, то X·2-1 участвует в формировании произведения, при y1 = 0, X·2-1 - не участвует в формировании произведения.
Выполнение такой последовательности соответствует умножению на старший разряд множителя и справедливо при умножении на все последующие разряды. Так, при умножении на второй разряд:
- производится второй сдвиг множимого, т.е. (X·2-1)·2-1;
- анализируется значение y2 и осуществляется или не осуществляется передача X·2-1 на суммирование.
Процесс умножения повторяется до просмотра всех y(i), i = 1,2,...,n.