Машинное кодирование десятичных чисел
В современных ЭВМ для облегчения связи человека с машиной имеется возможность подготавливать и вводить в машину исходную информацию в привычной для человека десятичной системе счисления и получать результаты обработки информации также в десятичной системе. Для этой цели используются специальные, так называемые, двоично-десятичные коды, позволяющие представлять десятичные цифры посредством двоичных символов (0 и 1). Известен ряд систем такого кодирования десятичной информации. Выбор системы кодирования определяется особенностью использования десятичной информации в ЭВМ.
Если десятичные числа используются только при вводе и выводе в машину информации, то наиболее важными требованиями к системе кодирования являются наглядность представления десятичных чисел и простота перевода из десятичной системы в двоичную и обратно.
Если ЭВМ предназначена для обработки экономической информации или иной другой, связанной с большим объемом обработки десятичных данных, то довольно часто с помощью специальных алгоритмов в машине производятся операции над числами в десятичной системе счисления. В этом случае к способу кодирования десятичных чисел предъявляются требования удобства выполнения арифметических операций над этими числами в соответствующем коде.
Наибольшее распространение в вычислительной технике нашел естественный двоично-десятичный позиционный код 8421, в котором каждая цифра десятичного числа от 0 до 9 заменяется соответствующим четырехразрядным двоичным числом (тетрадой) с весовыми коэффициентами разрядов (слева направо) 8,4,2,1 (табл. 3.1). Такой код называют также -кодом.
Таблица 3.1
Десятичные цифры | ||||||||||
Двоично-десятичный код 8421 |
Этот код удобен для выполнения машинных преобразований из десятичной системы в двоичную и обратно, а также для выполнения арифметических операций в -кодах.. Данный код аддитивен, то есть сумма представлений цифр есть код их суммы. В ЭВМ с десятичной арифметикой код знака десятичного числа в двоично-десятичном изображении обычно размещается справа в разрядной сетке и может представляться, как в двоичной системе счисления, наименьшей и наибольшей цифрой, кодирующей соответственно знаки плюс и минус: + ~ 0000; – ~ 1001.
При таком кодировании знаков тетерады двоично-десятичного числа, начиная с младшей, размещаются слева от знака в порядке возрастания весов. В запоминающем устройстве двоичные тетрады обычно хранятся в естественном прямом коде.
Описанный двоично-десятичный код 8421 без каких-либо модификаций мало удобен для реализации арифметических операций десятичными числами. Это вызвано трудностями обнаружения переноса в следующий десятичный разряд и относительной сложностью перехода к обратным и дополнительным кодам для десятичных чисел, облегчающим выполнение алгебраического сложения. Последнее объясняется тем, что код 8421 не является самодоопределяющимся, то есть инверсия его двоичных цифр не дает кода дополнения десятичной цифры до 9. В связи с этом, в процессе выполнения арифметических действий над двоично-десятичными числами, их коды преобразуются из системы 8421 либо в код с потетрадным избытком 3, либо в код с потетрадным избытком 6 (табл. 3.2), являющиеся самодоопределяющимисяи обеспечивающие легкое определение переноса из разряда в разряд, ввиду исключения лишних кодовых комбинаций (1010; 1011; 1100; 1101; 1110; 1111).
Таблица 3.2
Десятичная цифра | Естественный двоично-десятичный код (8421) | Код с избытком три | Код с избытком шесть |
Коды с потетрадным избытком 3 или 6 обеспечивают возможность применения достаточно простых в структурном отношении алгоритмов и устройств для выполнения арифметических операций в -кодах.
Для того, чтобы при сложении десятичных цифр, сумма которых больше девяти, сформировать единицу переноса и передать ее в следующий десятичный разряд, следует представить либо цифры обоих слагаемых в коде с избытком три, либо цифры одного из слагаемых в коде с избытком шесть, оставив другое слагаемое в естественном двоично-десятичном коде. Если при выполнении сложения с применением таких кодов возникает перенос в следующую тетраду, то результат в данном разряде получается в естественном двоично-десятичном коде (без избытка). Если в каких-либо тетрадах при выполнении операции переносы не возникли, то для получения истинного результата операции из кодов этих тетрад необходимо вычесть избытки шесть. Вычитание из тетрады избытка, т.е. числа 6 (0110) можно заменить потетрадным прибавлением его дополнения до 24, то есть числа 1010.
Из-за особенностей кодирования знаков знак результата приходится формировать по специальным правилам.
Пример.
Сложить два десятичных числа и .
Естественные двоично-десятичные коды чисел и соответственно будут иметь вид и .
Представим число в коде с потетрадным избытком шесть:
0000 1001 Х
+ 0110 0110 избыток 6
0110 1111 Х (с избытком 6).
В результате сложения сформированного с избытком 6 кода числа с кодом числа (без избытка) получим
0110 1111 Х (с избытком 6)
+ 0001 0110 Y
1000 0101 (Х+Y) (с избытком 6).
Поскольку при сложении возник перенос ← только из первой справа тетрады во вторую, то необходимо скорректировать содержимое второй тетрады, вычтя из нее число 6=0110, то есть прибавив его дополнение 1010. В результате выполнения этой операции получим истинный результат, равный, как нетрудно заметить, десятичному числу 25:
1000 0101 (Х+Y) (с избытком 6)
+ 1010 0000 коррекция
0010 0101 Х+Y=25.
Операция коррекции - потетрадная, поэтому все переносы из тетрад теряются и не влияют на результат.
Легко показать, что аналогичный результат будет получен, если в каждый из операндов ввести потетрадную избыточность 3= 0011.
X = 9 = 0000 1001
Y = 16 = 0001 0110
X(изб. 3) = 0011 1100
Y(изб. 3) = 0100 1001
X(изб. 3) + Y(изб. 3) = 1000 0101
коррекция 1010 0000
X + Y = 0010 0101 = 25(10)