Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Системы счисления и арифметика ЭВМ

.pdf
Скачиваний:
89
Добавлен:
15.05.2015
Размер:
637.72 Кб
Скачать

Уже отмечалось, что каждая цифра десятичного числа может быть представлена кодом от 0000 до 1001, поэтому если при сложении разряда j двоично-десятичного числа результат меньше, либо равен 9, то коррекции не требуется, так как двоично-десятичный код результата полностью совпадает с его двоичным кодом.

Пример: Zj=Xj+Yj = 3(10)+5(10), где j – номер разряда десятичного числа.

Xj +0011

1000(2-10)=8(10)=1000(2)

Yj 0101

 

Zj 1000(2-10)

 

Если при сложении j-разрядов чисел результат Zj будет больше или равен 10, то требуется коррекция результата. Рассмотрим, как машина может идентифицировать эту ситуацию. Существуют два варианта.

Вариант 1 Zj=10...15 = (1010...1111)

Здесь требуется коррекция, т. е. перенос 1 в старший (j+1) десятичный разряд. Необходимость коррекции в этом случае ЭВМ узнает по чисто формальным признакам:

8

4

2

1

 

r3

r2

r1

r0

Расположение 1 в четырёх разрядах

1

1

-

-

1

-

1

-

двоичного числа, которое указывает,

 

 

 

 

что Zj≥10.

Эту ситуацию можно описать логическим выражением: f = (r3 r2 ) (r3 r1 ) =1.

Пример: Zj=Xj+Yj = 5(10)+7(10) , где j – номер разряда десятичного числа.

Xj +0101

 

 

 

 

5

 

Yj → 0111

 

 

 

+7

 

 

 

 

 

 

 

 

 

 

Z

→ 1100

1

2(10)

j

. .

(2-10)

 

 

 

 

 

 

 

j+1

 

j

Перенос из разряда j означает в десятичной системе счисления, что Z′j = Z j −10 . В то же время в двоичной системе счисления перенос 1 из

51

младшей тетрады в старшую означает, что Z′j = Z j +16 . Следовательно, при коррекции имеет место соотношение

Zjкор = Zj - 10(10) + 16(10) = Zj + 6(10).

Тогда в рассмотренном выше примере

 

Zjкор → 1100+0110

 

Zj → 1100

т. о., имеем Zjкор=0010

 

+

 

 

 

и перенос 1 в j+1 разряд

 

6(10) 0110

 

 

Zjкор → 1← 0010

=12(10)

 

перенос

 

 

Вариант 2

Zj=16,17,18 = (8+8, 8+9, 9+9)

В этом случае из младшей тетрады в старшую происходит перенос 1 или 16(10). Но в десятичной системе счисления переносится в старший разряд только 10. Следовательно, для компенсации в младший разряд следует прибавить 6.

Пример: Zj=Xj+Yj = 8(10)+9(10) = 17(10), где j – номер разряда десятичного числа.

Xj

+

1000

 

Zj

+ 1 0001

 

Yj

 

1001

 

6(10)

 

0110

=17(10)

Zj

1←

0001

(2-10)

Zjкор

1 0111

перенос

 

 

 

 

 

 

Таким образом, можно сформулировать правило, по которому следует осуществлять коррекцию каждого десятичного разряда результата:

если при сложении многоразрядных двоично-десятичных чисел возник перенос из разряда или f=1, то этот разряд требует коррекции (прибавления 6(10)). При этом корректируются все тетрады последовательно, начиная с младшей.

Пример: Z = X + Y = 927 + 382 = 1309.

52

X →

1001 0010

0111

 

Y →

 

0011 1000

0010

 

 

 

 

 

 

 

Z →

 

1100 1010

1001

 

 

 

. . . .

 

 

 

2-й и 3-й разряды

. . . . . .

 

 

 

результата требуют

+

0110

 

 

- коррекция 2-й цифры

коррекции, так как f=1

 

 

 

 

1 0000

1001

 

 

 

 

 

 

 

 

 

 

 

+

1101 0000

1001

 

0110

 

 

- коррекция 3-й цифры

 

 

 

 

Zкор → 1

0011 0000

1001

 

Zкор =0001 0011 0000 1001(2-10) = 1309(10)

При практической реализации двоично-десятичной арифметики поступают несколько по-другому.

Алгоритм выполнения операции состоит в следующем:

1.Одно из слагаемых представляется в коде с избытком 6, т. е. к каждой тетраде двоично-десятичного числа добавляется число 0110. Избыток не обязательно добавлять к одному из слагаемых. Его можно добавить к результату сложения обоих модулей.

2.Сложение двоично-десятичных модулей выполняется по правилам двоичной арифметики.

3.Если при сложении тетрад получается результат Zj больше или равный 10, то автоматически вырабатывается перенос в следующий раз-

ряд (тетраду), поскольку фактически Zj16. В этом случае результат в данной тетраде получается в естественном двоично-десятичном коде 8421 и коррекции не требуется. Однако, если избыток добавлять к результату сложения модулей, а не к одному из слагаемых, то при выяснении необходимости коррекции следует учитывать переносы как при сложении модулей, так и при добавлении избытка.

4. Если при сложении в каких-либо тетрадах переносы отсутствуют, то для получения правильного результата из кодов этих тетрад необходимо вычесть избыток 6. Это можно сделать двумя способами:

просто вычесть число 0110(2) = 6(10);

сложить с дополнением до 16(10) , т. е. с числом 10(10) = 1010(2). Возникшие при этом межтетрадные переносы не учитываются.

53

На практике реализуют второй способ.

Пример: Z = X + Y = 132 + 57 = 189.

X → 0001 0011 0010

+

Y → 0000 0101 0111

Z’→ 0001 1000 1001 - нескорректированное Z.

Перед сложением операнды выравниваются по крайней правой тетраде. Теперь надо к Z’ добавить избыток (6(10)):

Z’→+0001 1000 1001

избыток → 0110 0110 0110

Z6’→ 0111 1110 1111 - нескорректированное избыточное Z. Такой же результат получится, если с избытком +6 взять один из операн-

дов (X или Y). Тогда к результату избыток прибавлять не нужно.

В данном примере при вычислении Z6’ не было переносов из какихлибо тетрад, поэтому необходима коррекция каждой тетрады суммы Z6’. Коррекция производится путем прибавления к каждой тетраде числа 10(10)= 1010(2):

Z6’→ 0111 1110 1111

коррекция → + 1010 1010 1010

Z → 0001 1000 1001

отбросить

переносы → 1

1

1

результат Z=0001 1000 1001(2-10)=189(10).

Пример: Z = X + Y = -93(10) - 48(10) = -(93+48)(10) = -141(10).

X → 0000 1001 0011

+

Y → 0000 0100 1000

Z’→ 0000 1101 1011 - нескорректированное Z.

Перед сложением операнды выравниваются по крайней правой тетраде. После этого к Z необходимо добавить избыток (6(10)):

Z’→ 0000 1101 1011

+

избыток → 0110 0110 0110

Z6’→ 0111 0100 0001 - нескорректированное избыточное Z. 1 1 - переносы

Такой же результат получится, если с избытком +6 взять один из операндов (X или Y). Тогда к результату избыток прибавлять нет необходимости. В данном примере из двух тетрад переносы существуют, поэтому необходима коррекция только старшей тетрады (из нее нет переноса):

54

Z6’→ 0111

0100 0001

 

коррекция

+1010

 

 

 

 

 

Z → 0001 0100 0001

перенос →

1

 

отбросить

результат Z = -(0001 0100 0001)(2-10) = -141(10).

Пример: Z = X + Y = 99(10) + 99(10) = 198(10).

X → 1001 1001

+

Y → 1001 1001

Z’ → 1 0011 0010 - нескорректированное Z. 1 1 - переносы

При сложении модулей возникли переносы. Добавим избыток:

Z’→+0001 0011 0010 избыток → 0110 0110 0110

Z6’→ 0111 1001 1000 - нескорректированное избыточное Z.

При добавлении избытка 6 переносов не было, однако они имели место при сложении модулей. Их следует учитывать при оценке необходимости коррекции, поэтому в данном случае коррекция требуется только для старшей тетрады:

Z6’→ 0111 1001 1000

+

коррекция → 1010

Z → 0001 1001 1000

перенос →

1

отбросить

результат Z=0001 1001 1000(2-10)=198(10).

8.3. Вычитание модулей двоично-десятичных чисел

По аналогии с операциями вычитания в двоичном коде операцию X-Y можно представить как X + (-Y). При этом отрицательное число представляется в дополнительном коде, аналогичном дополнительному коду в двоичной арифметике. Этот код используется только для выполнения операций вычитания. Хранятся двоично-десятичные числа (как положительные, так и отрицательные) в прямом коде со знаком.

Алгоритм выполнения операции состоит в следующем:

55

1. Модуль положительного числа представляется в прямом двоичнодесятичном коде (8421).

Модуль отрицательного числа – в дополнительном коде (ДК) с избытком 6.

Для получения ДК необходимо:

-инвертировать значения разрядов всех тетрад числа;

-к младшему разряду младшей тетрады прибавить 1.

Таким образом, цепочка ПК (mod) ОК ОК+1 ДК аналогична цепочке в двоичной арифметике. Только здесь получается ДК с избытком 6, так как дополнение идет не до 10, а до 16.

2.Произвести сложение операндов (X) в ПК и (Y) в ДК.

3.Если при сложении тетрад возник перенос из старшей тетрады, то он отбрасывается, а результату присваивается знак «+», т. е. результат получается в прямом избыточном коде. Он корректируется по тем же правилам, что и при сложении модулей.

4.Если при сложении тетрад не возникает переноса из старшей тетрады, то результату присваивается знак «-», т. е. результат получается в избыточном ДК. В этом случае необходимо перейти к избыточному ПК (т. е. инвертировать все двоичные разряды двоично-десятичного числа и прибавить к младшему разряду 1).

5.Полученный в этом случае результат в ПК корректируется. Для этого к тем тетрадам, из которых возникал перенос при выполнении пункта 2 (при суммировании), необходимо добавить 10(10) или 1010(2). Возникшие при этом межтетрадные переносы не учитываются. Таким образом, корректировка происходит в тех тетрадах, которые в положительных числах не корректируются. Следует отметить, что при выполнении операции вычитания большего числа из меньшего (X - Y =

Z, при |X||Y|), т. е. при Z0 алгоритм коррекции результата после перевода Z из ДК в ПК требует уточнения. А именно, после перевода Z в ПК необходимость коррекции определяется не только приведенными правилами, но и следующими требованиями:

а) нулевой результат не корректируется;

56

б) значащие нули справа в результате не корректируются;

в) если Z0 и в нем отсутствуют значащие нули справа (т. е. пп. а, б не имеют места), необходимо анализировать Y. Если в Y есть значащие нули справа, то соответствующие им разряды (тетрады) Z требуют обязательной коррекции, независимо от наличия переносов при сложении XПК и YДК.

Пример: Z=X-Y=49(10) -238(10) =-189(10).

X → 0000 0100 1001

Y → 0010 0011 1000

Представим |Y| в ДК с избытком 6:

 

YОК +1101 1100 0111

 

 

 

0001

 

 

YДК → 1101 1100 1000

Выполним сложение:

 

 

XПК + 0000 0100 1001

 

 

YДК 1101

1100 1000

- нескорректированное Z в ДК.

Z’ДК → 1110

0001 0001

1 1 - переносы

Отсутствие переноса из старшей тетрады является признаком того, что результат получился в ДК (т. е. отрицательный).

Перейдем к нескорректированному избыточному ПК:

Z’ДК

→ 1110 0001 0001

 

ZДК

→ 0001 1110 1110

 

+

0001

 

 

 

 

 

Z’ПК

→ 0001 1110 1111

- нескорректированное Z в ПК.

Произведем коррекцию результата в соответствии с п. 5 алгоритма:

Z’ПК +0001 1110 1111 коррекция → 0000 1010 1010 0001 1000 1001

переносы →

1

1 отбросить

результат |Z|= (0001 1000 1001) = 189(10)

Поскольку ранее результат получался в ДК, т. е. отрицательный, необходимо добавить знак (-). Окончательный результат будет следующий:

Z= -(0001 1000 1001) = -189(10).

Пример: Z=X-Y=143(10) -58(10) =85(10).

57

X → 0001 0100 0011

Y → 0000 0101 1000

Представим |Y| в ДК с избытком 6:

YОК → 1111 1010 0111 + 0001

YДК → 1111 1010 1000

Выполним сложение:

XПК → 0001 0100 0011

YДК +1111 1010 1000

Z’ПК → 0000 1110 1011 - нескорректированное Z в ПК.

- перенос отбросить

1

Наличие переноса из старшей тетрады указывает на то, что результат получился в ПК (т. е. положительный).

Произведем коррекцию результата в соответствии с п. 3 алгоритма:

Z’ПК +0000 1110 1011

коррекция → 1010 1010 0000 1000 0101

переносы →

1

1 отбросить

результат Z= 1000 0101(2-10)=85(10)

8.4. Умножение модулей двоично-десятичных чисел

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

Алгоритм выполнения операции состоит в следующем:

1.Сумма частичных произведений полагается равной нулю.

2.Анализируется очередная тетрада множителя, и множимое прибавляется к сумме частичных произведений столько раз, какова цифра, определяемая этой тетрадой.

3.Сумма частичных произведений сдвигается на одну тетраду, и повторяются действия, указанные в п. 2, пока все цифры (тетрады) множителя не будут обработаны. Направление сдвига зависит от того, ка-

58

кой вариант перемножения выбран – «старшие разряды вперед» или «младшие разряды вперед».

4. Каждая операция суммирования завершается десятичной коррекцией, соответствующей случаю суммирования двоично-десятичных чисел без избытка 6 (т. е. необходимо добавить 0110 к тем тетрадам, из которых был перенос или в которых f=1).

Пример: Z = X * Y = 25(10) * 13(10) = 325(10).

X = 25(10) = 0010 0101(2-10); Y = 13(10) = 0001 0011(2-10). Для решения примера выберем вариант перемножения "старшие разряды вперед". В соответствии с п. 1 алгоритма полагаем сумму частичных произведений P0=0. (Частичные произведения будем обозначать Pi).

Y = 0001 0011

X = 0010

0101

 

 

 

 

 

 

 

 

0000

0000

 

 

 

 

 

1(10)

+

 

 

 

 

 

 

 

0010

0101

 

 

 

 

 

 

 

 

 

 

+ 0010 0101

0000

 

 

 

 

 

3(10)

+

0010 0101

 

 

0010 0101

 

 

 

 

 

 

 

+

 

 

 

 

 

 

 

0010 0101

P0=0

P1 (1-е част. произв.)

Σ1=P0+P1=P1 – коррекции не требует

Сдвиг влево

P2 (2-е част. произв.).

Формирование второго частичного произведения – более длительная операция, поскольку вторая анализируемая тетрада содержит 3(10), поэтому каждая операция суммирования требует проверки необходимости коррекции. Вычислим P2, последовательно суммируя слагаемые, образующие P2:

Х →

0010

0101

 

Х →

+0010 0101

 

P'2 неп.

0100

1010

 

 

 

+

. .

 

 

 

 

. . .

 

 

 

 

 

 

коррекция →

0000

0110

 

P2 неп.

 

0101

0000

 

Х →

+0010 0101

 

P2

0111

0101

 

первое слагаемое Р2

второе слагаемое Р2

неполное, нескорректированное Р2

тетрада требует коррекции (f=1)

неполное, скорректированное Р2

третье слагаемое Р2

полное Р2. Коррекции не требует.

Таким образом, второе частичное произведение, состоящее из трех слагаемых, имеет вид

P2 = 0111 0101.

59

Теперь можно вычислить сумму первого и второго частичного произведений, т. е. результат:

 

P1

0010 0101 0000

← первое сдвинутое частичное произведение

 

P2

+

0111 0101

← второе частичное произведение

2

1

2

+

. .

← нескорректированный результат

∑‘

=P +P

0010 1100 0101

 

 

 

 

. . .

← тетрада требует коррекции (f=1)

коррекция → 0000 0110 0000

 

2=P1+P2

→ 0011 0010 0101

← скорректированный результат

Окончательный результат Z = 0011 0010 0101(2-10) = 325(10).

Следует отметить, что в данном случае при суммировании операндов не возникало переносов, поэтому коррекция осуществлялась только по признаку f=1.

8.5. Деление модулей двоично-десятичных чисел

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

9. Нарушение ограничений разрядной сетки ЭВМ

При выполнении арифметических операций возможны ситуации, когда нарушаются ограничения, связанные с конечной длиной разрядной сетки ЭВМ. При этом в ЭВМ формируются признаки соответственно:

для ЧФЗ – переполнения, когда результат не вмещается в отведенное количество бит (имеются в виду ЧФЗ справа от МЗР);

для ЧПЗ – положительного переполнения порядка, когда PZ>Pmax; и отрицательного переполнения порядка, когда PZ<Pmin (исчезно-

вение порядка).

Конкретная реакция различных ЭВМ и различных операционных систем на признаки нарушения ограничений в общем случае различна. Однако все они обязательно выполняют следующие операции:

60