Двоично-десятичное кодирование
Двоично-десятичное кодирование (Binary-coded decimal, BCD) — это форма записи десятичных чисел, при которой каждая десятичная цифра числа представляется фиксированным количеством двоичных разрядов (битов), обычно четырьмя. В отличие от обычной двоичной системы счисления, где число кодируется целиком, BCD-представление сохраняет поразрядную структуру десятичного числа, что упрощает преобразование между десятичной и двоичной формами и выполнение десятичных арифметических операций.
История
Идея представления десятичных цифр двоичными кодами возникла на заре вычислительной техники, когда основным интерфейсом взаимодействия с машиной были десятичные числа. Первые коммерческие компьютеры, такие как UNIVAC I (1951 год) и IBM 702 (1953 год), использовали двоично-десятичное кодирование для внутреннего представления данных, так как это упрощало ввод и вывод чисел, а также выполнение расчётов в финансовой и коммерческой сферах, где округления в двоичной системе были недопустимы. В 1950-х — 1960-х годах BCD был широко распространён в мейнфреймах IBM (например, серия IBM 1401) и в ранних миникомпьютерах. С развитием микропроцессоров и стандартизацией двоичной арифметики в 1970-х годах BCD постепенно уступил место чистому двоичному представлению для большинства вычислительных задач, однако остался востребованным в специализированных областях, требующих точных десятичных расчётов.
Основные принципы кодирования
В наиболее распространённом варианте BCD (называемом «упакованным BCD» или «8421-BCD») каждая десятичная цифра от 0 до 9 кодируется четырьмя битами, где веса разрядов соответствуют степеням двойки: 8, 4, 2, 1. Таким образом, цифра 5 кодируется как 0101, цифра 9 — как 1001. Шесть комбинаций (1010, 1011, 1100, 1101, 1110, 1111) являются недопустимыми и обычно считаются ошибкой или используются для специальных целей (например, представление знака).
Число, состоящее из нескольких десятичных цифр, кодируется последовательностью соответствующих четырёхбитовых групп. Например, число 1974 в упакованном BCD будет записано как 0001 1001 0111 0100 (без учёта знака). Для представления знака числа часто используется дополнительный полубайт (например, 1100 для плюса, 1101 для минуса), который размещается после младшей цифры или в старшем байте.
Другие варианты BCD-кодов
Существуют и другие системы кодирования десятичных цифр четырьмя битами, отличающиеся весами разрядов или принципом построения:
- Код «2421» — с весами 2, 4, 2, 1. Отличается тем, что является самодополняющимся: инвертирование битов кода даёт код для числа, дополняющего исходное до 9 (например, 3 = 0011, 6 = 1100).
- Код «4221» — с весами 4, 2, 2, 1. Также является самодополняющимся.
- Код «5211» — с весами 5, 2, 1, 1.
- Код с избытком 3 (Excess-3, XS-3) — строится как код 8421 для числа, увеличенного на 3. Например, цифра 0 кодируется как 0011 (0+3), цифра 9 — как 1100 (9+3). Этот код также является самодополняющимся и широко использовался в ранних компьютерах для упрощения десятичного сложения.
- Код Грея для десятичных цифр — редко применяемый вариант, обеспечивающий изменение только одного бита при переходе к соседней цифре.
Преимущества и недостатки
Преимущества
- Точность десятичных расчётов: BCD позволяет точно представлять десятичные дроби (например, 0.1), которые в двоичной системе с плавающей запятой представляются бесконечными периодическими дробями. Это критически важно для финансовых, бухгалтерских и коммерческих приложений, где недопустимы ошибки округления.
- Простота преобразования: Перевод числа из десятичной системы в BCD и обратно тривиален и не требует выполнения деления или умножения, что упрощает аппаратную и программную реализацию устройств ввода-вывода.
- Удобство для десятичной арифметики: Сложение и вычитание чисел в BCD могут выполняться по правилам десятичной арифметики с коррекцией промежуточных двоичных результатов, что позволяет использовать простые алгоритмы.
- Читаемость: BCD-представление легко интерпретируется человеком при отладке или анализе данных (например, в шестнадцатеричном дампе).
Недостатки
- Неэффективное использование памяти: Для хранения каждой десятичной цифры требуется 4 бита, хотя теоретически 4 бита могут хранить 16 значений. Таким образом, BCD использует на 20% больше памяти по сравнению с чистым двоичным представлением для чисел с большим количеством разрядов. Например, для хранения числа 9999 в двоичной системе нужно 14 бит (10011100001111), а в BCD — 16 бит.
- Сложность арифметики: Выполнение арифметических операций в BCD требует дополнительных шагов коррекции (например, добавление 6 к результату сложения двух цифр, если их сумма превышает 9), что замедляет вычисления по сравнению с двоичной арифметикой.
- Меньшая скорость: Аппаратные реализации BCD-арифметики обычно медленнее и сложнее, чем двоичные, что привело к отказу от BCD в универсальных процессорах общего назначения.
Применение
Несмотря на недостатки, BCD сохраняет актуальность в ряде специализированных областей:
- Финансовые и банковские системы: Многие стандарты финансовых расчётов (например, IEEE 754-2008 для десятичной арифметики с плавающей запятой) предписывают использование BCD для точного представления денежных сумм.
- Калькуляторы: Большинство электронных калькуляторов (как простых, так и инженерных) используют BCD для внутреннего представления чисел, поскольку это упрощает отображение на семисегментных индикаторах и выполнение десятичных операций.
- Промышленные контроллеры и PLC: В программируемых логических контроллерах, используемых в автоматизации, BCD часто применяется для обмена данными с датчиками и исполнительными механизмами, работающими в десятичном формате.
- Цифровые вольтметры и измерительные приборы: Для отображения результатов измерений на цифровых дисплеях.
- Системы реального времени: В некоторых авиационных и военных системах, где требуется высокая надёжность и точность десятичных вычислений.
- Стандарты обмена данными: Форматы представления времени (например, в некоторых протоколах GPS) и дат (например, в формате MMDDYY) часто используют BCD.
Аппаратная и программная поддержка
Исторически многие процессоры имели встроенную поддержку BCD-арифметики. Например, в архитектуре x86 (начиная с Intel 8086) существуют инструкции DAA (Decimal Adjust after Addition) и DAS (Decimal Adjust after Subtraction), которые корректируют результат двоичного сложения или вычитания для получения корректного BCD-результата. В современных 64-битных процессорах эти инструкции сохранены для обратной совместимости, но их использование не рекомендуется для новых разработок. В языке программирования COBOL, традиционно используемом в коммерческих приложениях, BCD является встроенным типом данных (PICTURE 9(n) COMP-3). В современных языках (C, C++, Java) для работы с BCD обычно используются специализированные библиотеки (например, libdecnumber), реализующие десятичную арифметику с плавающей запятой.
Интересные факты
- В некоторых ранних компьютерах, таких как IBM 650 (1953 год), данные хранились исключительно в BCD-формате на магнитном барабане.
- Стандарт IEEE 754-2008 определяет два формата десятичной арифметики с плавающей запятой: один из них (Densely Packed Decimal, DPD) использует более компактное кодирование, чем традиционный BCD, упаковывая три десятичные цифры в 10 бит.
- В русскоязычной литературе BCD иногда называют «двоично-кодированным десятичным кодом» или «кодом 8421».
Источники
- Tanenbaum, A. S. (2015). Structured Computer Organization. Pearson.
- Patterson, D. A., & Hennessy, J. L. (2017). Computer Organization and Design: The Hardware/Software Interface. Morgan Kaufmann.
- IEEE Standard for Floating-Point Arithmetic (IEEE 754-2008).
- Хоровиц, П., Хилл, У. (1988). Искусство схемотехники. Мир.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →