Открыть сервис

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

Двоично-десятичный код (англ. Binary-Coded Decimal, BCD) — это форма записи целых чисел, при которой каждая десятичная цифра числа представляется её двоичным эквивалентом, обычно четырёхбитным (тетрадой). В отличие от обычной двоичной системы счисления, где число кодируется целиком, BCD кодирует каждую десятичную цифру отдельно, что упрощает преобразование между десятичной и двоичной системами и работу с десятичными дробями в вычислительных устройствах.

История

Идея использования двоично-десятичного кода возникла на ранних этапах развития вычислительной техники. Первые коммерческие компьютеры, такие как UNIVAC I (1951 год) и IBM 702 (1953 год), использовали BCD для представления чисел, поскольку это упрощало ввод и вывод данных в десятичной системе, привычной для человека. В то время двоичная арифметика была менее распространена из-за сложности реализации операций с плавающей запятой.

В 1960-х годах BCD стал стандартом для многих мейнфреймов, особенно в финансовых и коммерческих приложениях, где точность десятичных вычислений критична. Например, процессоры IBM System/360 (1964 год) поддерживали BCD-арифметику на аппаратном уровне. С развитием микропроцессоров в 1970-х годах BCD-кодирование использовалось в калькуляторах и ранних микроконтроллерах, таких как Intel 4004.

В современных системах BCD применяется реже из-за неэффективного использования памяти (на каждую десятичную цифру требуется 4 бита, хотя для хранения чисел от 0 до 9 достаточно 4 бит, но при этом теряется 6 из 16 возможных комбинаций). Однако он остаётся важным в специализированных областях, таких как финансовые расчёты, где требуется точное представление десятичных дробей без ошибок округления, характерных для двоичной арифметики с плавающей запятой.

Классификация и виды

Существует несколько разновидностей двоично-десятичного кода, различающихся способом кодирования цифр и представления знака числа.

Упакованный BCD (Packed BCD)

В упакованном формате каждый байт (8 бит) содержит две десятичные цифры, каждая из которых занимает 4 бита (тетраду). Например, число 1234 в упакованном BCD кодируется как 0001 0010 0011 0100 (0x1234). Этот формат эффективен по памяти, так как на каждую цифру тратится ровно 4 бита, но требует дополнительной обработки для извлечения отдельных цифр.

Неупакованный BCD (Unpacked BCD)

В неупакованном формате каждая десятичная цифра занимает один байт (8 бит), причём старшие 4 бита обычно равны нулю или используются для хранения знака (например, в коде ASCII). Например, число 5 в неупакованном BCD может быть представлено как 0000 0101 (0x05). Этот формат менее эффективен по памяти, но упрощает обработку отдельных цифр и часто используется в системах с посимвольным вводом-выводом.

BCD со знаком

Для представления отрицательных чисел в BCD используются различные способы:

  • Прямой код: старший бит (или тетрада) резервируется для знака (например, 0 для плюса, 1 для минуса).
  • Дополнительный код: отрицательное число представляется как дополнение до 10 в соответствующем разряде (аналог дополнительного кода в двоичной системе, но с основанием 10).
  • Код с избытком 3 (Excess-3): каждая цифра увеличивается на 3 перед кодированием (например, 0 кодируется как 0011, 1 — как 0100). Это упрощает реализацию десятичного сложения и вычитания.

Другие варианты

  • BCD-код Грея: используется в некоторых аналого-цифровых преобразователях для уменьшения ошибок при переключении разрядов.
  • Двоично-десятичный код с плавающей запятой (BCD Floating Point): комбинация BCD для мантиссы и двоичного кода для порядка, применяется в специализированных калькуляторах.

Применение

Финансовые и коммерческие расчёты

Основная область применения BCD — финансовые системы, где требуется точное представление десятичных дробей (например, суммы в рублях и копейках). В двоичной арифметике с плавающей запятой числа вроде 0.1 не могут быть представлены точно, что приводит к ошибкам округления при многократных операциях. BCD позволяет избежать этих ошибок, что критично для банковских, бухгалтерских и налоговых расчётов. Многие языки программирования, такие как COBOL и PL/I, поддерживают BCD-типы данных (например, PIC 9(5)V99 в COBOL).

Калькуляторы и измерительные приборы

Ранние электронные калькуляторы, такие как Texas Instruments TI-2500 (1972 год), использовали BCD для внутреннего представления чисел, так как это упрощало отображение результатов на семисегментных индикаторах. Современные научные калькуляторы и измерительные приборы (мультиметры, частотомеры) также часто применяют BCD для точного отображения десятичных значений.

Микроконтроллеры и встраиваемые системы

Некоторые микроконтроллеры, например, семейство Intel MCS-48 (1976 год) и более поздние модели, имеют аппаратную поддержку BCD-арифметики (инструкции DAA — десятичная коррекция после сложения). Это используется в устройствах с цифровыми дисплеями, таких как электронные часы, таймеры и счётчики.

Телекоммуникации и протоколы

В некоторых телекоммуникационных протоколах, например, в формате телефонных номеров (E.164), BCD используется для кодирования цифр. В протоколе SS7 (Signaling System No. 7) номера телефонов передаются в упакованном BCD-формате.

Образование и обучение

BCD часто используется в учебных курсах по цифровой электронике и микропроцессорной технике для демонстрации принципов кодирования и арифметических операций.

Преимущества и недостатки

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

  • Точность: позволяет точно представлять десятичные дроби, что важно для финансовых расчётов.
  • Простота преобразования: легко конвертируется в десятичный формат для отображения на дисплеях.
  • Удобство отладки: BCD-код легко читается человеком при просмотре дампов памяти.

Недостатки

  • Неэффективное использование памяти: на каждую десятичную цифру тратится 4 бита, хотя для хранения чисел от 0 до 9 достаточно 4 бит, но при этом 6 из 16 возможных комбинаций не используются. В двоичной системе то же число занимает меньше бит (например, число 99 в двоичной системе — 7 бит, а в BCD — 8 бит).
  • Сложность арифметики: операции сложения и вычитания в BCD требуют дополнительной коррекции (например, после сложения двух тетрад может потребоваться добавление 6 для переноса в следующий разряд).
  • Меньшая скорость: BCD-арифметика обычно медленнее двоичной из-за необходимости коррекции.

Примеры

Кодирование числа 1234

  • Упакованный BCD: 0001 0010 0011 0100 (0x1234)
  • Неупакованный BCD: 0000 0001 0000 0010 0000 0011 0000 0100 (0x01020304)

Кодирование числа 0.5

  • BCD с фиксированной точкой: 0000 . 0101 (0x0.5)

Кодирование числа -7

  • Прямой код: 1000 0111 (знак 1, цифра 7)
  • Дополнительный код: 1001 0011 (дополнение до 10)

Интересные факты

  • В процессорах Intel x86 есть инструкция DAA (Decimal Adjust after Addition), которая выполняет коррекцию результата сложения двух BCD-чисел. Эта инструкция поддерживается в режиме реального адреса (Real Mode) и используется в некоторых эмуляторах и старых программах.
  • В языке программирования COBOL BCD-типы данных называются PIC (Picture) и могут иметь различную длину и формат (например, PIC 9(5)V99 — 5 целых и 2 дробных цифры).
  • BCD-кодирование используется в некоторых форматах хранения дат и времени, например, в файловой системе FAT (File Allocation Table) дата и время хранятся в BCD-формате (год, месяц, день, час, минута, секунда).
  • В СССР BCD-код применялся в вычислительных машинах серии «Минск» (1960-е годы) и в калькуляторах «Электроника» (1970-1980-е годы).

Источники

  • Таненбаум Э. Архитектура компьютера. — 6-е изд. — СПб.: Питер, 2013.
  • Столлингс У. Структурная организация и архитектура компьютерных систем. — 5-е изд. — М.: Вильямс, 2002.
  • Харрис Д., Харрис С. Цифровая схемотехника и архитектура компьютера. — 2-е изд. — М.: ДМК Пресс, 2018.
  • Intel 64 and IA-32 Architectures Software Developer’s Manual. — Intel Corporation, 2023.
  • COBOL Standard (ISO/IEC 1989:2014).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →