Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
учебник Информатика.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
17 Мб
Скачать
☆

Коды представления числовых данных в алу

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

  1. прямой код есть двоичный эквивалент числа;

  1. обратный код строится только для отрицательного числа -х. Пусть двоичное значение числа –х расположено в n двоичных разрядах. Тогда значение обратного кода для х (обозначим \х) определяется по формуле:

               \х = 2n – х – 1.                                

Это преобразованный прямой код, в котором все числовые разряды инвертируются, т.е. 1 преобразуются в 0, 0 превращается в 1;

  1. дополнительный код строится только для отрицательного числа –х. Пусть двоичное значение числа –х расположено в n двоичных разрядах. Тогда значение дополнительного кода для х (обозначим /х) определяется по формуле:

/х = 2n – х.                                

Это есть преобразованный обратный код, к которому прибавляется 1.

Очевидно, в силу приведенных выше формул верно следующее:

х + \х = 2n –1.                        

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

В таблице приведены прямые, обратные, дополнительные коды, полученные по приведенным формулам при n = 4, а также коды Штибица для десяти десятичных цифр:

Десятичная

цифра

Прямой

код

Обратный

код

Дополнительный

код

Код

Штибица

0

0000

1111

0000

0011

1

0001

1110

1111

0100

2

0010

1101

1110

0101

3

0011

1100

1101

0110

4

0100

1011

1100

0111

5

0101

1010

1011

1000

6

0110

1001

1010

1001

7

0111

1000

1001

1010

8

1000

0111

1000

1011

9

1001

0110

0111

1100

Зададимся кодом Штибица, равным 1000. Его целочисленный эквивалент равен 8 (напомним, что это коды со сдвигом на 3). Второе двоичное число, составляющее взаимно дополнительную пару чисел с числом 1000, есть 0111. Это и есть обратный код для числа 8 (см. для анализа таблицу). 

Принципы выполнения арифметической операции сложения в АЛУ

В основе выполнения всех простейших арифметических действий лежит операция сложения. Рассмотрим ее выполнение для целых и вещественных чисел.

Сложение целых чисел

Последовательность шагов при этом следующая:

  1. слагаемые размещаются в разрядных сетках в прямых кодах;

  1. отрицательное слагаемое (или слагаемые) преобразуется в обратный или дополнительный код (в зависимости от того, в какой форме выполняет операции АЛУ);

  1. слагаемые складываются по правилам сложения двоичных чисел. При этом знаковые разряды участвуют в вычислениях наряду с числовыми;

  1. единица переноса из знакового разряда (если таковая возникнет) отбрасывается при сложении в дополнительном коде или прибавляется к младшему числовому разряду при сложении в обратном коде;

  1. если результат положителен – он представлен в прямом коде и не требует никаких преобразований. Если результат отрицателен, то он представлен в обратном или дополнительном коде в зависимости от того, в каком коде происходило сложение. Результат в таком случае преобразуется в прямой код.

Пример 1. Сложить в обратном коде числа –34 и +15. Разрядная сетка – 8 бит.

  1. преобразуем слагаемые в прямые коды и разместим их в разрядных сетках:

-34 = -1000102

1

0

1

0

0

0

1

0

       +15 = +11112

0

0

0

0

1

1

1

1

  1. преобразуем отрицательное слагаемое -34 в обратный код:

1

1

0

1

1

1

0

1

  1. складываем слагаемые:

0

0

0

0

1

1

1

1

1

1

0

1

1

1

0

1

       ⇓

1

1

1

0

1

1

0

0

  1. единица переноса не образована;

  1. судя по знаку, результат отрицателен, значит, представлен в обратном коде  (поскольку сложение выполнялось в этом коде) и требует перевода в прямой код:

1

0

0

1

0

0

1

1

Таким образом, получено число –100112. Для проверки правильности результата представим его в десятичной системе счисления. Имеем: -100112 = -19, что соответствует правильному результату.

Пример 2. Сложить в обратном коде числа –34 и -15. Разрядная сетка – 8 бит.

  1. преобразуем слагаемые в прямые коды и разместим их в разрядных сетках:

-34 = -1000102

1

0

1

0

0

0

1

0

       -15 = -11112

1

0

0

0

1

1

1

1

  1. преобразуем отрицательные слагаемые в обратный код:

для -34

1

1

0

1

1

1

0

1

для -15

1

1

1

1

0

0

0

0

  1. складываем слагаемые:

1

1

0

1

1

1

0

1

1

1

1

1

0

0

0

0

               ⇓

1

1

0

0

1

1

0

1

1

  1. образовалась единица переноса из знакового разряда. В соответствии с правилами сложения в обратном коде, она прибавляется к младшему числовому разряду:

1

1

0

0

1

1

0

1

0

0

0

0

0

0

0

1

       ⇓

1

1

0

0

1

1

1

0

  1. судя по знаку, результат отрицателен, значит, представлен в обратном коде  (поскольку сложение выполнялось в этом коде) и требует перевода в прямой код:

1

0

1

1

0

0

0

1

Таким образом, получено число –1100012. Для проверки правильности результата представим его в десятичной системе счисления. Имеем: -1100012 = -49, что соответствует правильному результату.

Пример 3. Сложить в дополнительном коде числа –34 и -15. Разрядная сетка – 8 бит.

Первый этап совпадает с предыдущим примером.

Преобразуем слагаемые в дополнительный код. Для этого воспользуемся обратными кодами из примера 2:

для -34        

1

1

0

1

1

1

1

9

для -15

1

1

1

1

0

0

0

1

Складываем эти слагаемые и имеем результат:

1

1

0

0

1

1

1

1

1

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

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

1

1

0

0

1

1

1

1

       ⇓ в обратный код

1

1

0

0

1

1

1

0

       ⇓ в прямой код

1

0

1

1

0

0

0

1

Как видно, результат совпадает с результатом из примера 2, т.е. является правильным.

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

Пример 4. Сложить в обратном коде числа –64 и -67. Разрядная сетка – 8 бит.

После перевода чисел в двоичную систему счисления и размещения в разрядной сетке полученных прямых кодов имеем:

для -64

1

1

0

0

0

0

0

0

для -67

1

1

0

0

0

0

1

1

После перевода обоих слагаемых в обратный код и сложения имеем:

1

0

1

1

1

1

1

1

1

0

1

1

1

1

0

0

       ⇓

0

1

1

1

1

0

1

1

1

Образовалась единица переноса из знакового разряда.

После сложения единицы переноса имеем окончательный результат:

0

1

1

1

1

1

0

0

Анализ показывает, что результат положительный, что противоречит исходным данным: складывались два отрицательных числа. Это свидетельствует о переполнении (overflow) разрядной сетки.

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