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