Коды представления числовых данных
Для представления данных числовых типов существуют специальные коды, которые призваны облегчить выполнение арифметических операций (см. п. 9.3.4):
1) прямой кодесть двоичный эквивалент числа;
2) обратный кодстроится только для отрицательного числа -х. Пусть двоичное значение числа –х расположено в n двоичных разрядах. Тогда значение обратного кода для х (обозначим ùх) определяется по формуле:
ùх = 2n – х – 1. (9.2)
Это преобразованный прямой код, в котором все числовые разряды инвертируются, т.е. 1 преобразуются в 0, 0 превращается в 1;
3) дополнительный кодстроится только для отрицательного числа –х. Пусть двоичное значение числа –х расположено в n двоичных разрядах. Тогда значение дополнительного кода для х (обозначим ûх) определяется по формуле:
ûх = 2n – х. (9.3)
Это обратный код, к которому прибавляется 1.
Очевидно, в силу (9.2) и (9.3) верно следующее:
х + ùх = 2n –1. (9.4)
Последнее соотношение есть формальное определение взаимно дополнительных пар чисел. Оно позволяет быстро получить значение обратного кода для любого числа с помощью кодовых таблиц Штибица (см. ранее в п. 4.1.4). Рассмотрим эту задачу для десятичных цифр.
В табл. 9.3. приведены прямые, обратные, дополнительные коды, полученные по формулам (9.2) и (9.3) при n = 4, а также коды Штибица для десяти десятичных цифр.
Таблица 9.3
Десятичная цифра | Прямой код | Обратный код | Дополнительный код[10] | Код Штибица |
Зададимся кодом Штибица, равным 1000. Его целочисленный эквивалент равен 8 (напомним, что это коды со сдвигом на 3). Второе двоичное число, составляющее взаимно дополнительную пару чисел с числом 1000, есть 0111. Это и есть обратный код для числа 8 (см. для анализа табл. 9.3).
Принципы выполнения арифметической операции сложения
В основе выполнения всех простейших арифметических действий лежит операция сложения. Рассмотрим ее выполнение для целых и вещественных чисел.
Сложение целых чисел
Последовательность шагов при этом следующая:
1) слагаемые размещаются в разрядных сетках (см. п. 9.3.2.1) в прямых кодах;
2) отрицательное слагаемое (или слагаемые) преобразуется в обратный или дополнительный код (в зависимости от того, в какой форме выполняет операции АЛУ);
3) слагаемые складываются по правилам сложения двоичных чисел. При этом знаковые разряды участвуют в вычислениях наряду с числовыми;
4) единица переноса из знакового разряда (если таковая возникнет) отбрасывается при сложении в дополнительном коде или прибавляется к младшему числовому разряду при сложении в обратном коде;
5) если результат положителен – он представлен в прямом коде и не требует никаких преобразований. Если результат отрицателен, то он представлен в обратном или дополнительном коде в зависимости от того, в каком коде происходило сложение. Результат в таком случае преобразуется в прямой код.
Пример 9.8. Сложить в обратном коде числа –34 и +15. Разрядная сетка – 8 бит.
1) преобразуем слагаемые в прямые коды и разместим их в разрядных сетках. Имеем:
-34 = -1000102
+15 = +11112
|
2) преобразуем отрицательное слагаемое в обратный код. Имеем:
3) складываем слагаемые из (9.5) и (9.6). Имеем:
| ||||||||
|
4) единица переноса не образована;
5) судя по знаку, результат отрицателен, значит, представлен в обратном коде (поскольку сложение выполнялось в этом коде) и требует перевода в прямой код. Имеем:
Таким образом, получено число –100112. Для проверки правильности результата представим его в десятичной системе счисления. Имеем: -100112 = -19, что соответствует правильному результату.
Пример 9.9. Сложить в обратном коде числа –34 и -15. Разрядная сетка – 8 бит.
1) преобразуем слагаемые в прямые коды и разместим их в разрядных сетках. Имеем:
(9.7) |
-15 = -11112
|
2) преобразуем отрицательные слагаемые в обратный код. Имеем:
(9.9) |
(9.10) |
3) складываем слагаемые из (9.9) и (9.10). Имеем:
| ||||||||
|
единица переноса из знакового разряда
4) образовалась единица переноса из знакового разряда. В соответствии с правилами сложения в обратном коде, она прибавляется к младшему числовому разряду.
Имеем:
| |||||||||
окончательный результат |
5) судя по знаку, результат отрицателен, значит, представлен в обратном коде (поскольку сложение выполнялось в этом коде) и требует перевода в прямой код. Имеем:
Таким образом, получено число –1100012. Для проверки правильности результата представим его в десятичной системе счисления. Имеем: -1100012 = -49, что соответствует правильному результату.
Пример 9.10. Сложить в дополнительном коде числа –34 и -15. Разрядная сетка – 8 бит.
Первый этап совпадает с предыдущим примером.
Преобразуем слагаемые в дополнительный код. Для этого воспользуемся обратными кодами из (9.9) и (9.10). Имеем:
для (9.9)
для (9.10)
|
единица переноса из знакового разряда
Поскольку сложение выполняется в дополнительном коде, единица переноса из знакового разряда теряется. Таким образом, (9.11) – результат сложения в дополнительном коде. Поскольку он отрицателен, преобразуем его в прямой код. Тогда имеем:
|
обратный код результата |
прямой код результата |
Как видно, результат совпадает с результатом из примера 9.9, т.е. является правильным.
При сложении в обратном или дополнительном коде возникают ситуации переполнения.
Пример 9.11. Сложить в обратном коде числа –64 и -67. Разрядная сетка – 8 бит.
После перевода чисел в двоичную систему счисления и размещения в разрядной сетке полученных прямых кодов имеем:
для -64
для -67
После перевода обоих слагаемых в обратный код и сложения имеем:
| ||||||||
единица переноса из знакового разряда
После сложения единицы переноса имеем окончательный результат:
Анализ показывает, что результат положительный, что противоречит исходным данным: складывались два отрицательных числа. Это свидетельствует о переполнении (overflow) разрядной сетки.
Таким образом, формальным признаком переполнения разрядной сетки при выполнении операции сложения является то, что знак результата отличается от знаков слагаемых. Такая ситуация может возникнуть только при сложении чисел с одинаковыми знаками. С подобными ситуациями при сложении целых чисел самостоятельно компьютер не справляется, требуется вмешательство программиста.