Десятичное число с двоичным кодом

редактировать
A двоичные часы могут использовать светодиоды для отображения двоичных значений. В этих часах каждый столбец светодиодов показывает десятичное число в двоичном коде традиционного шестидесятеричного времени.

В вычислительных и электронных систем, двоично-десятичное (BCD ) - это класс двоичного кодирования десятичных чисел, где каждая цифра представлена ​​фиксированное количество битов, обычно или восемь. Иногда специальные битовые комбинации используются для знака или других индикаций (например, ошибки или переполнения).

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

Десять состояния, представляющих цифру BCD, иногда называют тетрадами (для полубайт, который обычно требуется для их хранения, также известен как тетрад), а неиспользуемые, безразлично -состояния называются псевдотетрадами (e) s [de ], псевдодесятичными или псевдодесятичными цифрами.

Основное достоинство BCD по сравнению с Двоичная система позиционирования - это более точное представление и округление десятичных величин, а также простота преобразования в обычные удобочитаемые представления. Его основные недостатки - небольшое увеличение сложности схем, необходимых для реализации арифметики, а также немного плотного хранения.

BCD использовался во многих ранних десятичных компьютерах и реализован в наборе команд таких машин, как серия IBM System / 360 и ее потомки, Процессоры VAX от Digital Equipment Corporation, Burroughs B1700 и Motorola 68000. Сам по себе BCD не так широко используется, как в прошлом, и больше не реализован в наборах команд новых компьютеров (например, ARM ); x86 больше не поддерживает свои инструкции BCD в длинном режиме. Однако десятичные форматы с фиксированной точкой и с плавающей точкой по-прежнему важны и номинальные финансовые, коммерческие и промышленные вычисления, где тонкое преобразование и дробное округление ошибки, присущие двоичной представлениям с плавающей запятой, недопустимы.

Содержание
  • 1 Фон
  • 2 Упакованный BCD
    • 2.1 Упакованный десятичный формат с фиксированной запятой
    • 2.2 Кодирование с более высокой плотностью
  • 3 Зонированная десятичная дробь
    • 3.1 Таблица преобразования зональной десятичной дроби EBCDIC
    • 3.2 Зонированная десятичная дробь с фиксированной точкой
  • 4 BCD в компьютерех
    • 4.1 IBM
    • 4.2 Другие компьютеры
  • 5 BCD в электронике
  • 6 Операции с BCD
    • 6.1 Сложение
    • 6.2 Вычитание
  • 7 Сравнение с чистым двоичным кодом
    • 7.1 Преимущества
    • 7.2 Недостатки
  • 8 Варианты представления
    • 8.1 Варианты со знаком
    • 8.2 Телефония в двоичном формате -кодированный десятичный (TBCD)
  • 9 Альтернативные кодировки
  • 10 Приложение
  • 11 Юридическая история
  • 12 См. также
  • 13 Примечания
  • 14 Ссылки
  • 15 Дополнительная литература
  • 16 Внешние ссылки
Предпосылки

BCD использует тот факт, что любое десятичное число может быть представлено четырехбитным шаблоном. Наиболее очевидным способом кодирования цифр является Natural BCD (NBCD), где каждая десятичная цифра представлена ​​своим четырехбитным двоичным размером, как показано в следующей таблице. Это также называется кодировкой «8421».

Десятичная цифраBCD
8421
00000
10001
20010
30011
40100
50101
60110
70111
81000
91001

Эта схема также может называться простой двоично-десятичной кодировкой (SBCD) или BCD 8421 и является наиболее распространенной кодировкой. Другие включают в себя так называемое кодирование «4221» и «7421» - названное в честь веса используемого для битов - и «Excess-3 ». Например, цифра 6 BCD, 0110'bв нотации 8421, будет 1100'bв 4221 (возможны две кодировки), 0110'bв 7421, а в Excess-3 это 1001'b(6 + 3 = 9 {\ displaystyle 6 + 3 = 9}{\ displaystyle 6 + 3 = 9} ).

4-битные двоично-десятичные коды и псевдотетрады
битВес0123456789101112131415Комментарий
480000000011111111двоичный
340000111100001111
220011001100110011
110101010101010101
имя0123456789101112131415десятичный
8 4 2 1 (XS-0)0123456789101112131415
7 4 2 10123456789
Айкен (2 4 2 1)0123456789
Превышение-3 (XS-3)-3-2-10123456789101112
Превышение-6 (XS-6)-6-5-4-3-2-10123456789
Перейти на 2 (2 4 2 1)0123456789
Перейти на 8 (2 4 2 1)0123456789
4 2 2 1 (I)0123456789
4 2 2 1 (II)0123456789
5 4 2 10123456789
5 2 2 10123456789
5 1 2 10123456789
5 3 1 10123456789
Белый (5 2 1 1)0123456789
5 2 1 10123456789
0123456789101112131415
Магнитная лента1234567890
Пол1326754089
Грей 0132675415141213891110
Гликсон 0132675498
4 3 1 10123546789
LARC 0124356798
Клар0124398756
Петерик (RAE)1320486795
О'Брайен I (Ваттс)0132498675
Томпкинс I 0132498756
Липпель0123498765
О'Брайен II 0214397856
Томпкинс II 0143279856
Эксцесс-3 Грей -3-20-1431212119105687
6 3-2-1 (I)3210548976
6 3-2-1 (II)0321654987
8 4 −2 −10432187659
Люкаль 0151411232138769411105
Каутц I0251379864
Каутц II9413286705
Сасскинд I0143298567
Сасскинд II0198432567
0123456789101112131415

В следующей таблице представлены десятичные цифры от 0 до 9 в различных системах кодирования BCD. В заголовках «8 4 2 1» указывает вес каждого бита. В пятом столбце («BCD 8 4 −2 −1») два веса отрицательны. Также показаны коды символов ASCII и EBCDIC для цифр, которые являются примерами зонального BCD.

. ЦифраBCD. 8 4 2 1Код Стибица или Excess-3 Код Айкена или BCD. 2 4 2 1BCD. 8 4-2 -1IBM 702, IBM 705, IBM 7080, IBM 1401. 8 4 2 1ASCII. 0000 8421EBCDIC. 0000 8421
0000000110000000010100011 00001111 0000
1000101000001011100010011 00011111 0001
2001001010010011000100011 00101111 0010
3001101100011010100110011 00111111 0011
4010001110100010001000011 01001111 0100
5010110001011101101010011 01011111 0101
6011010011100101001100011 01101111 0110
7011110101101100101110011 01111111 0111
8100010111110100010000011 10001111 1000
9100111001111111110010011 10011111 1001

Большинство компьютеров работают с данными в 8-битных байтах, можно использовать один из следующих методов для кодирования числа в формате BCD:

  • без упаковки : каждая десятичная цифра четыре кодируется в один байт, причем бита соответствует число, а остальные биты не имеют значения.
  • Упаковано : кодируются две десятичные цифры в одном байт, с одной цифрой в младшем значении полубайта (биты от 0 до 3 ), или другая цифра в старшем полубайте ( биты с 4 по 7).

Например, кодирование десятичного числа 91с использованием распакованного BCD приводит к следующему двоичному шаблону из двух байтов:

Десятичное: 9 1 Двоичное: 0000 1001 0000 0001

В упакованном BCD одно и то же число поместится в один байт:

Десятичное: 9 1 Двоичный: 1001 0001

Следовательно, числовой диапазон для одного распакованногота BCD составляет от нуля до девятиительно, тогда как диапазон для одного включенного упакованного байта BCD составляет от нуля до девяноста включительно.

Для представлений чисел, превышающих диапазон одного байта, какое-либо количество других байтов. Например, представить десятичное число 12345в упакованном двоично-десятичном формате с использованием формата big-endian, программа будет кодировать следующим образом:

Десятичное: 0 1 2 3 4 5 Двоичное: 0000 0001 0010 0011 0100 0101

Здесь старший полубайт старшего байта закодирован как ноль, поэтому число сохраняется как 012345(но процедуры форматирования могут заменять или удалять начальные нули). Упакованный BCD более эффективно использует хранилище, чем распакованный BCD; кодирование того же числа (с ведущим нулем) в распакованном формате потребует вдвое больше памяти.

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

Упакованный BCD

В упакованном BCD (или просто упакованном десятичном формате ), каждый из двух полубайтов каждого байта представить собой десятичную цифру. Упакованный BCD используется, по крайней мере, с 1960-х годов и с тех пор реализован во всем аппаратном устройстве мэйнфреймов IBM. Большинство реализаций - это big endian, есть с более значимой цифрой в верхней половине каждого байта и с крайним левым байтом (находящимся по наименьшему адресу памяти), содержащим наиболее значимые цифры упакованного десятичного значения. Младший полубайт самого правого байта обычно используется как знаковый флаг, хотя в некоторых представлениях без знака знаковый флаг отсутствует. Например, 4-байтовое значение включает из 8 полубайтов, при этом верхние 7 полубайтов хранят цифры 7-значного десятичного значения, а самый низкий полубайт указывает знак десятичного целочисленного значения.

Стандартные значения знака: 1100 (шестнадцатеричный C) для положительного (+) и 1101 (D) для отрицательного (-). Это соглашение использует поля зоны для символов EBCDIC и представления подписанного перфорирования. Другие допустимые знаки: 1010 (A) и 1110 (E) для положительного и 1011 (B) для отрицательного. Процессоры IBM System / 360 будут использовать знаки 1010 (A) и 1011 (B), если в PSW установлен бит A, для стандарта ASCII-8, который никогда не проходил. Большинство реализаций также предоставляют беззнаковые значения BCD со знаком полубайта 1111 (F). ILE RPG использует 1111 (F) для положительного и 1101 (D) для отрицательного. Они соответствуют зоне EBCDIC для цифр без перемычки знака. В упакованном BCD число 127 представлено как 0001 0010 0111 1100 (127C), а -127 представлено как 0001 0010 0111 1101 (127D). В системах Берроуза используется 1101 (D) для отрицательного значения, а любое другое значение считается положительным величиной (процессоры нормализуют положительный знак до 1100 (C)).

Знак. ЦифраBCD. 8 4 2 1ЗнакПри Записи
A1 0 1 0+
B1 0 1 1
C1 1 0 0+Предпочтительно
D1 1 0 1ительно
E1 1 1 0+
F1 1 1 1+Беззнаковый

Независимо от того, сколько байтов в ширину слово есть, всегда есть четное количество полубайтов, потому что в каждом байте их два. Следовательно, слово из n байтов может содержать до (2n) -1 десятичных цифр, что всегда является нечетным числом цифр. Десятичное число с d цифрами требует 1/2 (d + 1) байта памяти.

Например, 4-байтовое (32-битное) может содержать семь десятичных цифр плюс знак может содержать значения в диапазоне от ± 9 999 999. Таким образом, число −1,234,567 имеет ширину 7 цифр и кодируется как:

0001 0010 0011 0100 0101 0110 0111 1101 1 2 3 4 5 6 7 -

Как и символьные строки, первый байт упакованная десятичная дробь - с двумя старшими цифрами - обычно по младшему адресу в памяти, независимо от порядка байтов машины.

Напротив, 4-байтовое двоичное целое число с дополнением до двух может представлять значения от -2 147 483 648 до +2 147 483 647.

В то время как Использование BCD не обеспечивает оптимального использования хранилища (используется примерно на 20% больше памяти, чем двоичная запись для хранения тех же чисел), преобразование в ASCII, EBCDIC или различные кодировки Unicode по-прежнему тривиальны, поскольку не требуются арифметические операции. Требования к дополнительному хранилищу обычно компенсируются необходимой точностью и совместимостью с калькулятором или ручным вычислением, которые обеспечивают десятичную арифметика с фиксированной точкой. Существуют более плотные упаковки BCD, которые позволяют избежать потери памяти, а также не требуют арифметических операций для обычных преобразований.

Упакованный BCD поддерживается на языке программирования COBOL как «COMPUTATIONAL-3» (расширение IBM, принятое многими другими поставщиками компиляторов) или «PACKED-DECIMAL» (часть 1985 г. COBOL) тип данных. Он поддерживается в PL / I как «FIXED DECIMAL». Помимо IBM System / 360 и более поздних совместимых мэйнфреймов, упакованный BCD реализован в собственном наборе командных процессоров VAX от Digital Equipment Corporation и некоторых моделей SDS Мэйнфреймы Sigma series и является собственным форматом для линейки мэйнфреймов Burroughs Corporation Medium Systems (произошедшей с 1950-х годов).

Дополнение до десяти представлений отрицательных чисел предлагает альтернативный подход к кодированию знака упакованных (и других) двоично-десятичных чисел. В этом случае имеют старшую значащую цифру от 0 до 4 (включительно), в то время как отрицательные числа представлены дополнением до 10 соответствующего положительного числа. В результате эта система позволяет 32-битным упакованным числам BCD находиться в диапазоне от -50,000,000 до +49,999,999, а -1 представляется как 99999999. (Как и в случае с двоичными числами с дополнительным двоичным кодом, диапазон не является симметричным относительно нуля.)

Упакованное десятичное число с фиксированной точкой

Десятичное число с фиксированной точкой некоторыми некоторыми языками программирования (такими как COBOL, PL / I и Ada ). Эти языки позволяют программисту указывать не обозначать десятичную точку перед одной из цифр. Например, упакованное десятичное значение, закодированное байтами 12 34 56 7C, которое представляет собой значение с фиксированной точкой +1 234,567, когда представляет собой подразумеваемая десятичная точка находится между 4-й и 5-й цифрами:

12 34 56 7C 12 34, 56 7 +

Десятичная точка фактически не хранится в памяти, так как упакованный формат хранения BCD не предусматривает ее. Его местоположение просто компилятору известно, и сгенерированный код действует соответственно для различных арифметических операций.

Кодирование с более высокой плотностью

Если для десятичной цифры требуется четыре бита, то для трех десятичных цифр требуется 12 бит. Однако, поскольку 2 (1024) больше 10 (1000), если три десятичных цифры кодируются вместе, требуется только 10 бит. Двумя такими кодировками являются кодирование Чена - Хо и плотно упакованное десятичное число (DPD). Последнее имеет то преимущество, что подмножества кодирования кодируют две цифры в оптимальных семи битах и ​​одну цифру в четырех битах, как в обычном BCD.

Зонированное десятичное

Некоторые реализации, например, системы мэйнфреймов IBM, зонированное десятичное числовое представление. Каждая десятичная цифра хранится в одном байте, а четыре младших бита кодируют цифру в двоично-десятичной форме. Старые битами «зоны», обычно устанавливаются на фиксированное значение, так что байт содержитвольное значение, соответствующее цифре. Системы EBCDIC используют значение зоны 1111 (шестнадцатеричное F); это дает байты в диапазоне от F0 до F9 (шестнадцатеричный), которые являются кодами EBCDIC для символов от «0» до «9». Точно так же системы ASCII используют значение зоны 0011 (шестнадцатеричное 3), давая символьные коды от 30 до 39 (шестнадцатеричное).

Для зонированных десятичных чисел со знаком крайний правый (обозначенный значимый) полубайт зоны содержит знаковую цифру, которая представляет собой тот же набор значений, который используется для упакованных десятичных чисел со знаком (см. Выше). Таким образом, зональное десятичное значение, закодированное как шестнадцатеричные байты F1 F2 D3, представляет десятичное значение со знаком −123:

F1 F2 D3 1 2 −3

Таблица преобразования зонального десятичного числа EBCDIC

Цифра BCDШестнадцатеричныйСимвол EBCDIC
0+C0A0E0F0{(*)\ (*)0
1+C1A1E1F1A~ (*)1
2+C2A2E2F2BsS2
3+C3A3E3F3CtT3
4+C4A4E4F4DuU4
5+C5A5E5F5EvV5
6+C6A6E6F6FwW6
7+C7A7E7F7GxX7
8+C8A8E8F8HyY8
9+C9A9E9F9IzZ9
0–D0B0} (*)^ (*)
1-D1B1J
2-D2B2K
3 -D3B3L
4-D4B4M
5-D5B5N
6-D6B6O
7-D7B7P
8-D8B8Q
9-D9B9R

(*) Примечание. Эти символы различаются в зависимости от локального символа настройка кодовой страницы.

Десятичный разделитель с фиксированной точкой

Некоторые языки (например, COBOL и PL / I) напрямую зонированные десятичные значения с фиксированной точкой, назначенная неявная десятичная точка в некотором месте между десятичными цифрами. Например, для шестибайтного зонального десятичного значения со знаком с подразумеваемой десятичной точкой от правой четвертой цифры шестнадцатеричные байты F1 F2 F7 F9 F5 C0 укажите +1 279,50:

F1 F2 F7 F9 F5 C0 1 2 7 9. 5 +0
BCD в компьютерех

IBM

IBM использовала термины двоично-десятичный код обмена (BCDIC, иногда просто BCD) для 6-битных букв-цифровых кодов, представляющих числа, прописные буквы и специальные символы. Некоторые варианты буквенных обозначений BCDIC использовались в первых ранних компьютерах IBM, включая IBM 1620 (представленный в 1959 г.), IBM 1400 series и не Decimal Architecture члены серии IBM 700/7000.

Серия IBM 1400 - это машины с символьной последовательностью адресов, состоящей из шести битов, обозначенных B, A, 8, 4, 2 и 1, плюс бит проверки нечетности (C) и бит словарного знака (М). Для кодирования цифр с 1 по 9, B и A равны нулю, а значение цифры, представленное стандартным 4-битным BCD в битах с 8 по 1. Для большинства других символов биты B и A выводятся просто из «12», «11», и «0» «пробивки зоны» в символьном коде перфокарты и биты с 8 по 1 от пробелов с 1 по 9. Пробойник «12 зон» задает как B, так и A, пробойник «11 зон» - набор B, а пробойник «0 зона» (пробивка 0 в сочетании с любыми другими) устанавливает A. Таким образом, буква A, которая is (12,1) в формате перфокарты, закодировано (B, A, 1). Символ валюты $, (11,8,3) на перфокарте, был закодирован в памяти как (B, 8,2,1). Это позволяет схемам выполнять преобразование между форматом перфокарты и форматом внутреннего хранилища очень простым с учетом лишь нескольких особых случаев. Одним из важных особых случаев является цифра 0, представленная единственным перфоратором 0 на карте, и (8,2) в основной памяти.

Память IBM 1620 организована в виде 6-битных адресных цифр, обычно 8, 4, 2, 1 плюс F, используется как бит флага и C, как бит проверки нечетности. Буквенно-цифровые двоично-десятичные символы кодируются с использованием пар цифр, где «зона» в разряде с четным адресом и «цифра» в разряде с нечетным адресом, «зона» связана с «штрихами зоны» 12, 11 и 0 как в серии 1400. Аппаратные средства преобразования ввода / вывода преобразуют внутренние пары цифр во внешние стандартные 6-битные коды BCD.

В десятичной архитектуре IBM 7070, IBM 7072 и IBM 7074 буквенные обозначения кодируются с использованием пар цифр (с использованием двух- код из пяти ( в цифрах, не BCD) 10-значного слова, с «зоной» в левой цифре и «цифрой» в правой цифре. Аппаратные средства преобразования ввода / вывода преобразуют внутренние пары цифр во внешние стандартные 6-битные коды BCD.

С введением System / 360 IBM расширила 6-битные буквенные обозначения BCD до 8-битных EBCDIC, что позволило добавлять гораздо больше символов (например, строчные буквы). Также реализован числовой тип данных Packed BCD переменной длины, обеспечивающий машинные инструкции, которые выполняют арифметические операции непосредственно с упакованными десятичными данными.

На IBM 1130 и 1800 упакованный BCD поддерживается программным обеспечением с помощью коммерческого пакета подпрограмм IBM.

Сегодня данные BCD по-прежнему активн о используются в процессорах и базах данных IBM, таких как IBM DB2, мэйнфреймы и Power6. В этих продуктах BCD обычно представляет собой зональный BCD (как в EBCDIC или ASCII), упакованный BCD (две десятичные цифры на байт) или «чистое» кодирование BCD (одна десятичная цифра сохраняется как BCD в младших четырех битах каждого байта). Все они используются в аппаратных регистрах и процессорах, а также в программном обеспечении. Чтобы преобразовать упакованные десятичные дроби в выгрузке таблицы EBCDIC в читаемые числа, вы можете использовать маску OUTREC FIELDS утилиты JCL DFSORT.

Другие компьютеры

Серия Digital Equipment Corporation VAX-11 включает инструкции, которые могут выполнять арифметические операции непосредственно с упакованными данными BCD и преобразовывать между упакованными данными BCD и другими целочисленными представлениями. Упакованный формат BCD VAX совместим с форматом IBM System / 360 и более поздних совместимых процессоров IBM. В реализациях MicroVAX и более поздних VAX эта возможность отсутствует в ЦП, но сохранена совместимость кода с более ранними машинами за счет реализации отсутствующих инструкций в библиотеке программного обеспечения, поставляемой операционной системой. Он вызывается автоматически через обработку исключений, когда встречаются несуществующие инструкции, так что программы, использующие их, могут выполняться без изменений на новых машинах.

Архитектура Intel x86 поддерживает уникальный 18-значный (десятибайтный) формат BCD, который можно загружать и сохранять из регистры с плавающей запятой, из которых могут выполняться вычисления.

В Motorola серии 68000 были инструкции BCD.

В более поздних компьютерах такие возможности почти всегда реализуются в программном обеспечении. чем набор команд ЦП, но числовые данные в формате BCD все еще чрезвычайно распространены в коммерческих и финансовых приложениях. Существуют уловки для реализации упакованных операций BCD и зональных десятичных операций сложения или вычитания с использованием коротких, но трудных для понимания последовательностей логики параллельных слов и двоичных арифметических операций. Например, следующий код (написанный на C ) вычисляет беззнаковое 8-значное упакованное BCD сложение с использованием 32-битных двоичных операций:

uint32_t BCDadd (uint32_t a, uint32_t b) {uint32_t t1, t2 ; // беззнаковые 32-битные промежуточные значения t1 = a + 0x06666666; t2 = t1 ^ b; // сумма без распространения переноса t1 = t1 + b; // предварительная сумма t2 = t1 ^ t2; // все двоичные биты переноса t2 = ~ t2 0x11111110; // биты переносятся только в двоично-десятичном коде t2 = (t2>>2) | (t2>>3); // коррекция return t1 - t2; // исправленная сумма BCD}
BCD в электронике

BCD очень распространена в электронных системах, где должно отображаться числовое значение, особенно в системах, состоящих исключительно из цифровой логики и не содержащих микропроцессор. Используя двоично-десятичный код, можно значительно упростить манипуляции с числовыми данными для отображения, если рассматривать каждую цифру как отдельную подсхему. Это гораздо больше соответствует физической реальности дисплейного оборудования - например, разработчик может использовать серию отдельных идентичных семисегментных дисплеев для построения измерительной схемы. Если бы числовые величины хранились и обрабатывались как чисто двоичные, для взаимодействия с таким дисплеем потребовались бы сложные схемы. Следовательно, в случаях, когда вычисления относительно просты, работа с BCD может привести к более простой системе, чем преобразование в двоичную систему и обратно. Большинство карманных калькуляторов делают все свои расчеты в формате BCD.

Тот же аргумент применим, когда оборудование этого типа использует встроенный микроконтроллер или другой небольшой процессор. Часто внутреннее представление чисел в формате BCD приводит к меньшему размеру кода, поскольку преобразование из или в двоичное представление может быть дорогостоящим на таких ограниченных процессорах. Для этих приложений некоторые небольшие процессоры имеют специальные арифметические режимы, которые помогают при написании процедур, которые манипулируют величинами BCD.

Операции с BCD

Сложение

Можно выполнять сложение, сначала добавив в двоичном формате, а затем преобразовав в двоично-десятичный формат. Преобразование простой суммы двух цифр может быть выполнено путем добавления 6 (то есть от 16 до 10), когда пятиразрядный результат добавления пары цифр имеет значение больше 9. Причина добавления 6 заключается в том, что есть 16 возможных 4-битных значений BCD (поскольку 2 = 16), но действительны только 10 значений (от 0000 до 1001). Например:

1001 + 1000 = 10001 9 + 8 = 17

10001 - это двоичное, а не десятичное, представление желаемого результата, но наиболее значимая 1 («перенос») не помещается в 4-битное двоичное число. В BCD, как и в десятичном, не может существовать значение больше 9 (1001) на цифру. Чтобы исправить это, к общей сумме добавляется 6 (0110), а затем результат обрабатывается как два полубайта:

10001 + 0110 = 00010111 =>0001 0111 17 + 6 = 23 1 7

Два полубайта результата 0001 и 0111 соответствуют цифрам «1» и «7». Это дает "17" в BCD, что является правильным результатом.

Этот метод можно расширить до добавления нескольких цифр, добавляя группы справа налево, распространяя вторую цифру как перенос, всегда сравнивая 5-битовый результат каждой суммы пар цифр с 9. Некоторые процессоры предоставить флаг полупереноса для облегчения арифметических корректировок BCD после операций двоичного сложения и вычитания.

Вычитание

Вычитание выполняется путем добавления десятичного дополнения к вычитаемому к уменьшаемому. Чтобы представить знак числа в BCD, число 0000 используется для представления положительного числа, а 1001 используется для представления отрицательного числа. Остальные 14 комбинаций - недопустимые знаки. Чтобы проиллюстрировать вычитание BCD со знаком, рассмотрим следующую задачу: 357 - 432.

В BCD со знаком 357 равно 0000 0011 0101 0111. Десятичное дополнение 432 может быть получено, взяв девять дополнений из 432, а затем добавление единицы. Итак, 999 - 432 = 567 и 567 + 1 = 568. Если поставить перед 568 в BCD отрицательный знаковый код, можно представить число −432. Итак, -432 в BCD со знаком - это 1001 0101 0110 1000.

Теперь, когда оба числа представлены в BCD со знаком, их можно сложить вместе:

0000 0011 0101 0111 0 3 5 7 + 1001 0101 0110 1000 9 5 6 8 = 1001 1000 1011 1111 9 8 11 15

Поскольку двоично-десятичный формат является формой десятичного представления, некоторые приведенные выше цифровые суммы недействительны. В случае, если существует недопустимая запись (любая цифра BCD больше 1001), добавляется 6 для генерации бита переноса и превращения суммы в действительную запись. Итак, добавление 6 к недопустимым записям приводит к следующему:

1001 1000 1011 1111 9 8 11 15 + 0000 0000 0110 0110 0 0 6 6 = 1001 1001 0010 0101 9 9 2 5

Таким образом, результатом вычитания будет 1001 1001 0010 0101 (-925). Чтобы подтвердить результат, обратите внимание, что первая цифра - 9, что означает отрицательный результат. Это кажется правильным, поскольку 357–432 должны давать отрицательное число. Остальные полубайты представляют собой двоично-десятичный код, поэтому 1001 0010 0101 равно 925. Десятичное дополнение к 925 составляет 1000 - 925 = 75, поэтому вычисленный ответ равен -75.

Если складывается другое количество полубайтов (например, 1053 - 2), число с меньшим количеством цифр должно быть сначала предварено нулями, прежде чем выполнять десятичное дополнение или вычитание. Итак, с 1053-2, 2 нужно сначала представить как 0002 в BCD, и нужно будет вычислить десятичное дополнение 0002.

Сравнение с чистым двоичным кодом

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

  • Многие нецелые значения, такие как десятичное число 0,2, имеют бесконечное представление разряда в двоичном формате (.001100110011...), но имеют конечное разрядное значение в десятичной системе с двоичным кодом (0,0010). Следовательно, система, основанная на десятичных представлениях десятичных дробей в двоичном коде, позволяет избежать ошибок при представлении и вычислении таких значений. Это полезно в финансовых расчетах.
  • Простое масштабирование в 10 степени.
  • Округление на границе десятичной цифры проще. Сложение и вычитание в десятичном формате не требуют округления.
  • Выравнивание двух десятичных чисел (например, 1,3 + 27,08) - это простой, точный сдвиг.
  • Преобразование в символьную форму или для отображения (например, в текстовый формат, такой как XML, или для управления сигналами для семисегментного дисплея ) - это простое преобразование по цифрам, которое может быть выполнено линейным (O (n)) время. Преобразование из чистого двоичного включает относительно сложную логику, которая охватывает цифры, а для больших чисел не известен алгоритм линейного преобразования времени (см. Двоичная система счисления § Преобразование в другие системы счисления и из них ).

Недостатки

  • Некоторые операции сложнее реализовать. Сумматоры требуют дополнительной логики, чтобы заставить их оборачиваться и генерировать перенос раньше. Для сложения BCD требуется на 15-20 процентов больше схем по сравнению с чистым двоичным кодом. Умножение требует использования алгоритмов, которые несколько более сложны, чем сдвиг-маска-сложение (требуется двоичное умножение, требующее двоичных сдвигов и сложений или эквивалентных, для каждой цифры или группы цифр).
  • Для стандартного BCD требуется четыре бита на цифру, что примерно на 20 процентов больше, чем при двоичном кодировании (отношение 4 бита к логарифму 2 10 бит составляет 1,204). При упаковке так, что т ри цифры закодированных в десять бит, накладные расходы на хранение значительно сокращаются за счет кодирования, которое n выровнен с 8-битными границами байтов, обычными для существующего оборудования, что приводит к более медленной реализации в этих системах.
  • Практические существующие реализации BCD обычно медленнее, чем операции с двоичными представлениями, особенно во встроенных системах, из-за ограниченного процессора поддержка собственных операций BCD.
Варианты представления

Существуют различные реализации BCD, в которых используются другие представления чисел. Программируемые калькуляторы производства Texas Instruments, Hewlett-Packard и другие обычно используют формат с плавающей запятой BCD, обычно с двумя или три цифры для (десятичной) экспоненты. Дополнительные биты знаковой цифры могут использоваться для обозначения специальных числовых значений, таких как бесконечность, потеря значимости / переполнение и ошибка (мигающий дисплей).

Варианты со знаком

Десятичные значения со знаком могут быть представлены несколькими способами. Например, язык программирования COBOL поддерживает в общей сложности пять зонных десятичных форматов, каждый из которых кодирует числовой знак по-разному:

ТипОписаниеПример
Без знакаПолубайт без знакаF1 F2 F3
Завершающий знак со знаком (канонический формат)Полубайт знака в последнем (наименее значимом) байтеF1 F2 C3
Ведущий со знаком ( overpunch)Sign nibble in the first (most significant) byteC1 F2 F3
Signed trailing separateSeparate sign character byte ('+'or '−') following the digit bytesF1 F2 F3 2B
Signed leading separateSeparate sign character byte ('+'or '−') preceding the digit bytes2BF1 F2 F3

Telephony binary-coded decimal (TBCD)

3GPP developed TBCD, an expansion to BCD where the remaining (unused) bit combinations are used to add specific telephony characters, with digits similar to those found in telephone keypad s original design.

Decimal. DigitTBCD. 8 4 2 1
*1 0 1 0
#1 0 1 1
a1 1 0 0
b1 1 0 1
c1 1 1 0
Used as filler when there is an odd number of digits1 1 1 1

The mentioned 3GPP document defines TBCD-STRINGwith swapped nibbles in each byte. Bits, octets and digits indexed from 1, bits from the right, digits and octets from the left.

bits 8765 of octet n encoding digit 2n

bits 4321 of octet n encoding digit 2(n – 1) + 1

Meaning number 1234, would become 21 43in TBCD.

Alternative encodings

If errors in representation and computation are more important than the speed of conversion to and from display, a scaled binary representation may be used, which stores a decimal number as a binary-encoded integer и двоично-закодированную десятичную экспоненту со знаком. Например, 0,2 можно представить как 2 × 10.

Это представление допускает быстрое умножение и деление, но может потребовать сдвига в степени 10 во время сложения и вычитания для выравнивания десятичных знаков. Он подходит для приложений с фиксированным количеством десятичных знаков, которые не требуют такой настройки, особенно для финансовых приложений, где обычно достаточно 2 или 4 цифр после десятичной точки. В самом деле, это почти форма арифметики с фиксированной запятой, поскольку подразумевается положение точки.

Кодировки Герц и Чен – Хо обеспечивают булевы преобразования для преобразования групп из трех цифр в кодировке BCD в 10-битные значения, которые могут быть эффективно закодированы в оборудование только с 2 или 3 задержками ворот. Плотно упакованное десятичное число (DPD) представляет собой аналогичную схему, которая используется для большей части значимого значения, за исключением ведущей цифры, для одного из двух альтернативных десятичных кодировок, указанных в IEEE 754-2008 стандарт с плавающей запятой.

Приложение

BIOS во многих персональных компьютерах хранит дату и время в BCD, поскольку MC6818 в реальном времени Чип часов, использованный в исходной материнской плате IBM PC AT, обеспечивал время, закодированное в BCD. Эта форма легко конвертируется в ASCII для отображения.

Компьютеры 8-битного семейства Atari использовали двоично-десятичный код для реализации алгоритмов с плавающей запятой. Процессор MOS 6502 имеет режим BCD, который влияет на команды сложения и вычитания. Программное обеспечение портативного компьютера Psion Organizer 1, поставляемое производителем, также полностью использует BCD для реализации операций с плавающей запятой; более поздние модели Psion использовали исключительно двоичные файлы.

Ранние модели PlayStation 3 хранят дату и время в BCD. Это привело к отключению консоли во всем мире 1 марта 2010 года. Последние две цифры года, сохраненные как BCD , были неверно интерпретированы как как 16, что привело к ошибке в дате устройства, что сделало большинство функций неработоспособными. Это было названо Проблема 2010 года.

Юридическая история

В деле 1972 года Готтшалк против Бенсона Верховный суд США отменил решение суда низшей инстанции, в котором позволил получить патент на преобразование чисел в двоично-десятичном коде в двоичные на компьютере. Это было знаменательное решение, определившее патентоспособность программного обеспечения и алгоритмов.

См. Также
Примечания
Ссылки
Дополнительная литература
Внешние ссылки
Последняя правка сделана 2021-05-12 06:24:22
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте