Двоично-десятичный код

Эта статья входит в число готовых статей
Эта статья прошла проверку экспертом
Материал из «Знание.Вики»

Двоично-десятичный код (англ. 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]:

  1. каждый раз, когда происходит перенос бита в старший полубайт, необходимо к полубайту, из которого произошёл перенос, добавить корректирующее значение 01102 = 610 = (1610 — 1010). Эта коррекция представляет собой разницу количеств комбинаций полубайта и используемых значений, с учётом того, что из всех комбинаций в тетраде разрешённых 10, а запрещенных 6.
  2. каждый раз, когда встречается недопустимая для полубайта комбинация (число, большее 910), необходимо к каждой недопустимой комбинации добавить корректирующее значение 01102 с разрешением переноса в старшие полубайты.
  3. При вычитании двоично-десятичных чисел для каждого полубайта, получившего заём из старшего полубайта, необходимо провести коррекцию, отняв значение 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]:

Преимущества

Использование BCD-кода в семисегментном индикаторе
  1. Удобно использовать для вывода числа на одноразрядные индикаторы — достаточно просто вывести на индикацию каждый полубайт. По этой же причине проще ввод данных с цифровой клавиатуры.
  2. Для дробных чисел (как с фиксированной, так и с плавающей запятой) при переводе в привычный десятичный формат и наоборот не теряется точность.
  3. Упрощены умножение и деление на 10, а также округление.

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

Недостатки

  1. Требует больше памяти.
  2. По сравнению с полноценными системами счисления усложнены арифметические операции.

Разновидности двоично-десятичных кодов

Рассмотренная выше кодировка 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. 1,0 1,1 1,2 Что такое BCD. Инфо-МАСТЕР. Дата обращения: 6 апреля 2024.
  2. КОДИРОВАНИЕ ИНФОРМАЦИИ В ЭВМ. ДВОИЧНО-ДЕСЯТИЧНЫЙ КОД. Дата обращения: 13 апреля 2024.
  3. Двоично-десятичная арифметика. Технический Университет Молдовы. Дата обращения: 6 апреля 2024.
  4. 4,0 4,1 Луцик Ю. А., Лукьянова И. В. Арифметические и логические основы вычислительной техники. Учебное пособие. — Минск: Белорусский государственный университет информатики и радиоэлектроники, 2014. — 174 с. — ISBN 978-985-543-032-3.

Ссылки

Системное программирование. Обработка данных в форматах ASCII и BCD