Двоично-десятичный код
Двоично-десятичный код (англ. binary coded decimal, сокр. BCD) — форма записи десятичных рациональных чисел, когда каждая цифра десятичного числа записывается в виде четырёхбитного двоичного числа (тетрады)[1]. Наиболее распространенным BCD-кодом является код NBCD (натуральный двоично-десятичный код, который называют кодом 8421, по значениям степеней двойки), в котором каждая двоичная тетрада принимает значения от 00002 до 10012, что соответствует ряду десятичных цифр от 0 до 9.
Код BCD распространён для использования в финансовых расчетах, поскольку двоичные числа с плавающей точкой не всегда могут с достаточной точностью представлять все десятичные числа. Кроме того, двоично-десятичный код широко использовался в станках с ЧПУ ранних моделей для представления десятичных чисел на программных носителях — перфолентах.
Преимущество BCD-кода перед классическим двоичным представлением заключается в отсутствии ограничений на размер числа. Разрядность чисел, представленных в двоичном формате, обычно ограничивается разрядностью регистров. При использовании BCD добавление нового десятичного разряда предполагает просто добавление новой последовательности из 4 битов.
Представление чисел в BCD-коде
Подробно представление десятичных цифр в двоично-десятичном коде выглядит следующим образом:
Десятичные цифры: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 Их представление в BCD: 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001
Остальные комбинации нулей и единиц в тетраде не используются, либо используются для представления служебных символов. Например, в телефонной связи кроме десятичных цифр кодируются символы * или #, или любые другие. Для записи этих символов используются следующие комбинации[1]:
BCD | Дополнительный символ |
1010 | * (звёздочка) |
1011 | # (решётка) |
1100 | (плюс) |
1101 | - (минус) |
1110 | , (десятичная запятая) |
1111 | символ гашения |
Представление BCD-кода в байт-ориентированных цифровых системах.
Существуют два распространённых способа представления BCD-кода в байт-ориентированных цифровых системах[2]:
- Неупакованный, когда в байте хранится одна десятичная цифра, остальные 4 бита не используются.
Для представления в этом виде каждая десятичная цифра (от 0 до 9) преобразуется в двоично-десятичный эквивалент из четырех бит (от 0000 до 1001) и записывается в младшую тетраду байта (полубайт). Значение старшего полубайта обычно не существенно. Можно как в коде EBCDIC (от англ. Extended Binary Coded Decimal Interchange Code) использовать комбинацию 0011 или, для удобства отладки, можно записать нули.
Например, кодирование десятичного числа 96 с использованием неупакованного BCD выглядит следующим образом:
Десятичный: 9 | 1 или десятичный: 9 | 1 Двоичный: 0011 1001 |0011 0110 двоичный: 0000 1001 |0000 0110
Неупакованный формат используется при выполнении операций умножения и деления двоично-десятичных чисел.
- Упакованный, когда в одном байте хранятся две десятичных цифры. В этом случае в одном байте можно записать десятичные числа от 0 до 99.
В этом случае число 96 будет выглядеть как:
Десятичный: 9 | 6 Двоичный: 1001 |0110
Упакованный формат используется при выполнении операций сложения и вычитания двоично-десятичных чисел.
Стандартной формы записи для отрицательного представления чисел в BCD-коде нет. Например, язык программирования COBOL поддерживает в общей сложности пять способов кодирования знака. Это может быть младший полубайт самого правого байта или отдельный знаковый байт, предшествующий цифровым байтам.
Обычно кодовое представление знака 1100 для (+) и 1101 для (-), но встречаются и другие кодировки[3].
Арифметические операции с числами в BCD-коде
При сложении и вычитании чисел, представленных в формате BCD (8421), действуют следующие правила[4]:
- каждый раз, когда происходит перенос бита в старший полубайт, необходимо к полубайту, из которого произошёл перенос, добавить корректирующее значение 01102 = 610 = (1610 — 1010). Эта коррекция представляет собой разницу количеств комбинаций полубайта и используемых значений, с учётом того, что из всех комбинаций в тетраде разрешённых 10, а запрещенных 6.
- каждый раз, когда встречается недопустимая для полубайта комбинация (число, большее 910), необходимо к каждой недопустимой комбинации добавить корректирующее значение 01102 с разрешением переноса в старшие полубайты.
- При вычитании двоично-десятичных чисел для каждого полубайта, получившего заём из старшего полубайта, необходимо провести коррекцию, отняв значение 01102.
По сути BCD — это неполная шестнадцатеричная система с использованием чисел от 0 до 9 (числа A÷F являются запрещёнными).
Например, для сложения десятичных чисел D = 3927 и C = 4856 по правилам арифметических операций в BCD-коде необходимо произвести следующие действия:
- представим числа D и C в двоично-десятичной форме:
D = 392710 = 0011 1001 0010 0111BCD
C = 485610 = 0100 1000 0101 0110BCD
- суммируем поразрядно числа D и С по правилам двоичной арифметики с применением к результатам поразрядных сложений требований описанных выше правил:
* ** 0011 1001 0010 0111 + 0100 1000 0101 0110 ___________________ = 1000 0001 0111 1101 - двоичная сумма + 0110 0110 - коррекция ___________________ 1000 0111 1000 0011
(*) — тетрада, из которой был перенос в старшую тетраду
(**) — тетрада с запрещённой комбинацией битов
В тетраду, помеченную символом (*), добавляем коррекцию 01102 = 610, так как по правилам двоичной арифметики перенос унёс с собой {{{1}}} а по правилам десятичной арифметики должен был унести {{{1}}} В тетраду, помеченную символом (**), также добавляем 01102 и разрешаем дальнейший перенос, так как комбинация битов 1101 в тетраде BCD-кода является запрещённой.
Преимущества и недостатки формата BCD-кода
Представление десятичных чисел в формате двоично-десятичного кода имеет следующие преимущества и недостатки[1]:
Преимущества
- Удобно использовать для вывода числа на одноразрядные индикаторы — достаточно просто вывести на индикацию каждый полубайт. По этой же причине проще ввод данных с цифровой клавиатуры.
- Для дробных чисел (как с фиксированной, так и с плавающей запятой) при переводе в привычный десятичный формат и наоборот не теряется точность.
- Упрощены умножение и деление на 10, а также округление.
По этим причинам двоично-десятичный формат применяется в калькуляторах и других несложных цифровых устройствах.
Недостатки
- Требует больше памяти.
- По сравнению с полноценными системами счисления усложнены арифметические операции.
Разновидности двоично-десятичных кодов
Рассмотренная выше кодировка NBCD 8421 является наиболее распространенной разновидностью двоично-десятичных кодов. Другие используют иные кодировки тетрад с применением двоичных символов, такие как, например, код Айкена (2421) или код Штибица, известный как «Excess-3 code» (код с избытком три)[4].
Представление десятичных чисел в коде Excess-3
Для получения десятичной цифры, представленной в коде Excess-3, необходимо в каждой тетраде двоично-десятичного кода BCD 8421 добавить число (0011)2 = 310.
Десятичные цифры: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 Представление в BCD 8421: 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 Представление в BCD Excess-3: 0011 | 0101 | 0101 | 0110 | 0111 | 1000 | 1001 | 1010 | 1011 | 1100
Коды 0000 и 1111 не используются ни для одной цифры.
Представление чисел в коде Excess-3 значительно упрощает арифметические операции, поскольку в арифметике Excess-3 используются другие алгоритмы, позволяющие устранить недостаток, возникающий при использовании двоично-десятичного кода 8421 для сложения двух десятичных цифр, сумма которых превышает 9.
Литература
Петцольд, Чарльз. Код. Тайный язык информатики / науч.ред. В. Артюхин, ; пер. с англ. О. Сивченко. — М.: «МИФ», 2019. — 448 с. — ISBN 978-5-00117-545-2.
Примечания
- ↑ 1,0 1,1 1,2 Что такое BCD . Инфо-МАСТЕР. Дата обращения: 6 апреля 2024.
- ↑ КОДИРОВАНИЕ ИНФОРМАЦИИ В ЭВМ. ДВОИЧНО-ДЕСЯТИЧНЫЙ КОД . Дата обращения: 13 апреля 2024.
- ↑ Двоично-десятичная арифметика . Технический Университет Молдовы. Дата обращения: 6 апреля 2024.
- ↑ 4,0 4,1 Луцик Ю. А., Лукьянова И. В. Арифметические и логические основы вычислительной техники. Учебное пособие. — Минск: Белорусский государственный университет информатики и радиоэлектроники, 2014. — 174 с. — ISBN 978-985-543-032-3.
Ссылки
Системное программирование. Обработка данных в форматах ASCII и BCD
Данная статья имеет статус «готовой». Это не говорит о качестве статьи, однако в ней уже в достаточной степени раскрыта основная тема. Если вы хотите улучшить статью — правьте смело! |
Данная статья имеет статус «проверенной». Это говорит о том, что статья была проверена экспертом |