В вычислительных и электронных системах двоично-десятичное кодирование ( BCD ) представляет собой класс двоичного кодирования десятичных чисел, где каждая цифра представлена фиксированным числом битов , обычно четырьмя или восемью. Иногда специальные битовые комбинации используются для знака или других указаний (например, ошибки или переполнения).
В байт- ориентированных системах (то есть в большинстве современных компьютеров) термин « распакованный двоично-десятичный код» [1] обычно подразумевает полный байт для каждой цифры (часто включая знак), тогда как упакованный двоично-десятичный код обычно кодирует две цифры в одном байте, используя преимущества Тот факт, что четырех битов достаточно для представления диапазона от 0 до 9. Точное 4-битное кодирование, однако, может варьироваться по техническим причинам (например, Excess-3 ).
Десять состояний, представляющих цифру BCD, иногда называют тетрадами [2] [3] ( полубайт, обычно необходимый для их хранения, также известен как тетрада), в то время как неиспользуемые, безразличные состояния называются псевдотетрадами (e ) s , [4] [5] [6] [7] [8] псевдодесятичные числа [3] или псевдодесятичные числа . [9] [10] [номер 1]
Основное достоинство BCD по сравнению с двоичными позиционными системами - это более точное представление и округление десятичных величин, а также простота преобразования в обычные представления, удобочитаемые человеком. Его основные недостатки - небольшое увеличение сложности схем, необходимых для реализации базовой арифметики, а также немного менее плотное хранилище.
BCD был использован во многих ранних десятичных компьютерах , и реализуется в наборе команд машин , такие как IBM System / 360 серии и его потомки, корпорации Digital Equipment Corporation «s VAX , в Burroughs B1700 , и Motorola 68000 -рядов процессоры. Сам по себе BCD не так широко используется, как в прошлом, и больше не реализован в наборах команд новых компьютеров (например, ARM ); x86 больше не поддерживает свои инструкции BCD в длинном режиме . Однако десятичные числа с фиксированной и плавающей запятойформаты по-прежнему важны и продолжают использоваться в финансовых, коммерческих и промышленных вычислениях, где недопустимы тонкие ошибки преобразования и дробного округления , присущие двоичным представлениям с плавающей запятой. [11]
BCD использует тот факт, что любое десятичное число может быть представлено четырехбитным шаблоном. Наиболее очевидным способом кодирования цифр является Natural BCD (NBCD), где каждая десятичная цифра представлена соответствующим четырехбитным двоичным значением, как показано в следующей таблице. Это также называется кодировкой «8421».
Десятичная цифра | BCD | |||
---|---|---|---|---|
8 | 4 | 2 | 1 | |
0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 0 | 1 |
2 | 0 | 0 | 1 | 0 |
3 | 0 | 0 | 1 | 1 |
4 | 0 | 1 | 0 | 0 |
5 | 0 | 1 | 0 | 1 |
6 | 0 | 1 | 1 | 0 |
7 | 0 | 1 | 1 | 1 |
8 | 1 | 0 | 0 | 0 |
9 | 1 | 0 | 0 | 1 |
Эта схема также может называться Simple Binary-Coded Decimal ( SBCD ) или BCD 8421 и является наиболее распространенной кодировкой. [12] Другие включают так называемое кодирование «4221» и «7421» - названное в честь веса, используемого для битов - и « Превышение-3 ». [13] Например, цифра 6 BCD 0110'b
в нотации 8421 находится 1100'b
в 4221 (возможны две кодировки), 0110'b
в 7421, а в Excess-3 это 1001'b
( ).
Немного | Масса | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | Комментарий |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
4 | 8 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | Двоичный |
3 | 4 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | |
2 | 2 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | |
1 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | |
Имя | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | Десятичная дробь | |
8 4 2 1 (XS-0) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | [14] [15] [16] [17] [nb 2] | |
7 4 2 1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | [18] [19] [20] | |||||||
Айкен (2 4 2 1) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | [14] [15] [16] [17] [nb 3] | |||||||
Превышение-3 (XS-3) | -3 | -2 | -1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | [14] [15] [16] [17] [nb 2] | |
Превышение-6 (XS-6) | -6 | -5 | -4 | -3 | -2 | -1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | [18] [nb 2] | |
Прыжок-2 (2 4 2 1) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | [16] [17] | |||||||
Прыжок-8 (2 4 2 1) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | [21] [22] [16] [17] [nb 4] | |||||||
4 2 2 1 (I) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | [16] [17] | |||||||
4 2 2 1 (II) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | [21] [22] | |||||||
5 4 2 1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | [18] [14] [16] [17] | |||||||
5 2 2 1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | [14] [16] [17] | |||||||
5 1 2 1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | [19] | |||||||
5 3 1 1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | [16] [17] | |||||||
Белый (5 2 1 1) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | [23] [18] [14] [16] [17] | |||||||
5 2 1 1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | [24] | |||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | |||
Магнитная лента | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | [15] | |||||||
Павел | 1 | 3 | 2 | 6 | 7 | 5 | 4 | 0 | 8 | 9 | [25] | |||||||
серый | 0 | 1 | 3 | 2 | 7 | 6 | 4 | 5 | 15 | 14 | 12 | 13 | 8 | 9 | 11 | 10 | [26] [14] [15] [16] [17] [nb 2] | |
Glixon | 0 | 1 | 3 | 2 | 6 | 7 | 5 | 4 | 9 | 8 | [27] [14] [15] [16] [17] | |||||||
Ледли | 0 | 1 | 3 | 2 | 7 | 6 | 4 | 5 | 8 | 9 | [28] | |||||||
4 3 1 1 | 0 | 1 | 2 | 3 | 5 | 4 | 6 | 7 | 8 | 9 | [19] | |||||||
LARC | 0 | 1 | 2 | 4 | 3 | 5 | 6 | 7 | 9 | 8 | [29] | |||||||
Клар | 0 | 1 | 2 | 4 | 3 | 9 | 8 | 7 | 5 | 6 | [2] [3] | |||||||
Петерик (РАЭ) | 1 | 3 | 2 | 0 | 4 | 8 | 6 | 7 | 9 | 5 | [30] [31] [nb 5] | |||||||
О'Брайен I (Ватт) | 0 | 1 | 3 | 2 | 4 | 9 | 8 | 6 | 7 | 5 | [32] [14] [16] [17] [nb 6] | |||||||
5-циклический | 0 | 1 | 3 | 2 | 4 | 5 | 6 | 8 | 7 | 9 | [28] | |||||||
Томпкинс I | 0 | 1 | 3 | 2 | 4 | 9 | 8 | 7 | 5 | 6 | [33] [14] [16] [17] | |||||||
Липпель | 0 | 1 | 2 | 3 | 4 | 9 | 8 | 7 | 6 | 5 | [34] [35] [14] | |||||||
О'Брайен II | 0 | 2 | 1 | 4 | 3 | 9 | 7 | 8 | 5 | 6 | [32] [14] [16] [17] | |||||||
Томпкинс II | 0 | 1 | 4 | 3 | 2 | 7 | 9 | 8 | 5 | 6 | [33] [14] [16] [17] | |||||||
Избыток-3 Серый | -3 | -2 | 0 | -1 | 4 | 3 | 1 | 2 | 12 | 11 | 9 | 10 | 5 | 6 | 8 | 7 | [16] [17] [20] [номер 7] [номер 2] | |
6 3 −2 −1 (I) | 3 | 2 | 1 | 0 | 5 | 4 | 8 | 9 | 7 | 6 | [29] [36] | |||||||
6 3 −2 −1 (II) | 0 | 3 | 2 | 1 | 6 | 5 | 4 | 9 | 8 | 7 | [29] [36] | |||||||
8 4 −2 −1 | 0 | 4 | 3 | 2 | 1 | 8 | 7 | 6 | 5 | 9 | [29] | |||||||
Lucal | 0 | 15 | 14 | 1 | 12 | 3 | 2 | 13 | 8 | 7 | 6 | 9 | 4 | 11 | 10 | 5 | [37] | |
Каутц I | 0 | 2 | 5 | 1 | 3 | 7 | 9 | 8 | 6 | 4 | [18] | |||||||
Каутц II | 9 | 4 | 1 | 3 | 2 | 8 | 6 | 7 | 0 | 5 | [18] [14] | |||||||
Сасскинд I | 0 | 1 | 4 | 3 | 2 | 9 | 8 | 5 | 6 | 7 | [35] | |||||||
Сасскинд II | 0 | 1 | 9 | 8 | 4 | 3 | 2 | 5 | 6 | 7 | [35] | |||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
В следующей таблице представлены десятичные цифры от 0 до 9 в различных системах кодирования BCD. В заголовках " " указывает вес каждого бита. В пятом столбце («BCD 8 4 -2 -1») два веса отрицательны. Также показаны коды символов ASCII и EBCDIC для цифр, которые являются примерами зонированного BCD.8 4 2 1
Цифра | BCD 8 4 2 1 | Код Стибица или Превышение-3 | Код Айкен или BCD 2 4 2 1 | BCD 8 4 −2 −1 | IBM 702 , IBM 705 , IBM 7080 , IBM 1401 8421 | 0000 8421-й символ таблицы ASCII | EBCDIC 0000 8421 |
---|---|---|---|---|---|---|---|
0 | 0000 | 0011 | 0000 | 0000 | 1010 | 0011 0000 | 1111 0000 |
1 | 0001 | 0100 | 0001 | 0111 | 0001 | 0011 0001 | 1111 0001 |
2 | 0010 | 0101 | 0010 | 0110 | 0010 | 0011 0010 | 1111 0010 |
3 | 0011 | 0110 | 0011 | 0101 | 0011 | 0011 0011 | 1111 0011 |
4 | 0100 | 0111 | 0100 | 0100 | 0100 | 0011 0100 | 1111 0100 |
5 | 0101 | 1000 | 1011 | 1011 | 0101 | 0011 0101 | 1111 0101 |
6 | 0110 | 1001 | 1100 | 1010 | 0110 | 0011 0110 | 1111 0110 |
7 | 0111 | 1010 | 1101 | 1001 | 0111 | 0011 0111 | 1111 0111 |
8 | 1000 | 1011 | 1110 | 1000 | 1000 | 0011 1000 | 1111 1000 |
9 | 1001 | 1100 | 1111 | 1111 | 1001 | 0011 1001 | 1111 1001 |
Поскольку большинство компьютеров обрабатывают данные в 8-битных байтах , можно использовать один из следующих методов для кодирования числа BCD:
Например, кодирование десятичного числа 91
с использованием распакованного BCD приводит к следующему двоичному шаблону из двух байтов:
Десятичный: 9 1 Двоичный: 0000 1001 0000 0001
В упакованном BCD одно и то же число поместится в один байт:
Десятичный: 9 1 Двоичный: 1001 0001
Следовательно, числовой диапазон для одного неупакованного байта BCD составляет от нуля до девяти включительно, тогда как диапазон для одного упакованного байта BCD составляет от нуля до девяноста девяти включительно.
Для представления чисел, превышающих диапазон одного байта, может использоваться любое количество смежных байтов. Например, чтобы представить десятичное число 12345
в упакованном двоично-десятичном формате, используя формат с прямым порядком байтов , программа будет кодировать следующим образом:
Десятичный: 0 1 2 3 4 5 Двоичный: 0000 0001 0010 0011 0100 0101
Здесь самый значимый полубайт самого значимого байта закодирован как ноль, поэтому число сохраняется как 012345
(но процедуры форматирования могут заменять или удалять начальные нули). Упакованный BCD более эффективен в использовании хранилища, чем распакованный BCD; кодирование того же числа (с начальным нулем) в распакованном формате потребует вдвое больше памяти.
Операции сдвига и маскирования используются для упаковки или распаковки упакованной цифры BCD. Другие побитовые операции используются для преобразования числа в эквивалентный ему битовый шаблон или обратного процесса.
В упакованном BCD (или просто упакованном десятичном [38] ) каждый из двух полубайтов каждого байта представляет собой десятичную цифру. [nb 8] Упакованный BCD используется по крайней мере с 1960-х годов и с тех пор реализован во всем аппаратном обеспечении мэйнфреймов IBM. Большинство реализаций с прямым порядком байтов, то есть с более значимой цифрой в верхней половине каждого байта и с крайним левым байтом (находящимся по наименьшему адресу памяти), содержащим наиболее значимые цифры упакованного десятичного значения. Младший полубайт крайнего правого байта обычно используется как знаковый флаг, хотя в некоторых представлениях без знака знаковый флаг отсутствует. Например, 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). [39] [40] [41] ILE RPG использует 1111 (F) для положительного и 1101 (D) для отрицательного. [42]Они соответствуют зоне EBCDIC для цифр без перемычки знака. В упакованном BCD число 127 представлено как 0001 0010 0111 1100 (127C), а -127 представлено как 0001 0010 0111 1101 (127D). В системах Берроуза используется 1101 (D) для отрицательного значения, а любое другое значение считается положительным значением знака (процессоры нормализуют положительный знак до 1100 (C)).
Знаковая цифра | BCD 8 4 2 1 | Знак | Примечания |
---|---|---|---|
А | 1 0 1 0 | + | |
B | 1 0 1 1 | - | |
C | 1 1 0 0 | + | Предпочтительный |
D | 1 1 0 1 | - | Предпочтительный |
E | 1 1 1 0 | + | |
F | 1 1 1 1 | + | Без подписи |
Независимо от того, сколько байтов имеет слово , всегда есть четное количество полубайтов, потому что в каждом байте их два. Следовательно, слово из n байтов может содержать до (2 n ) -1 десятичных цифр, что всегда является нечетным числом цифр. Десятичное число с д цифр требуется 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» (часть стандарта COBOL 1985 года). Он поддерживается в PL / I как «FIXED DECIMAL». Помимо IBM System / 360 и более поздних совместимых мэйнфреймов, упакованный BCD реализован в собственном наборе инструкций исходных процессоров VAX от Digital Equipment Corporation и некоторых моделей мэйнфреймов серии SDS Sigma и является собственным форматом для Medium Systems Burroughs Corporation. линейка мэйнфреймов (произошла от серии Electrodata 200 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 10 (1024) больше 10 3 (1000), если три десятичных цифры кодируются вместе, потребуется только 10 бит. Двумя такими кодировками являются кодирование Чен-Хо и плотно упакованное десятичное (DPD). Последнее имеет то преимущество, что подмножества кодирования кодируют две цифры в оптимальных семи битах и одну цифру в четырех битах, как в обычном двоично-десятичном коде.
Некоторые реализации, например системы мэйнфреймов IBM , поддерживают зонные десятичные числовые представления. Каждая десятичная цифра хранится в одном байте, а младшие четыре бита кодируют цифру в двоично-десятичной форме. Старшие четыре бита, называемые битами «зоны», обычно устанавливаются на фиксированное значение, так что байт содержит символьное значение, соответствующее цифре. Системы EBCDIC используют значение зоны 1111 (шестнадцатеричное F); это дает байты в диапазоне от F0 до F9 (шестнадцатеричный), которые являются кодами EBCDIC для символов от «0» до «9». Точно так же системы ASCII используют значение зоны 0011 (шестнадцатеричное 3), давая символьные коды от 30 до 39 (шестнадцатеричное).
Для зонированных десятичных значений со знаком крайний правый (наименее значащий) полубайт зоны содержит знаковую цифру, которая представляет собой тот же набор значений, который используется для упакованных десятичных чисел со знаком (см. Выше). Таким образом, зональное десятичное значение, закодированное как шестнадцатеричные байты F1 F2 D3, представляет десятичное значение со знаком -123:
F1 F2 D3 1 2 −3
Цифра BCD | Шестнадцатеричный | EBCDIC символ | ||||||
---|---|---|---|---|---|---|---|---|
0+ | C0 | A0 | E0 | F0 | {(*) | \ (*) | 0 | |
1+ | C1 | A1 | E1 | F1 | А | ~ (*) | 1 | |
2+ | C2 | A2 | E2 | F2 | B | s | S | 2 |
3+ | C3 | A3 | E3 | F3 | C | т | Т | 3 |
4+ | C4 | A4 | E4 | F4 | D | ты | U | 4 |
5+ | C5 | A5 | E5 | F5 | E | v | V | 5 |
6+ | C6 | A6 | E6 | F6 | F | ш | W | 6 |
7+ | C7 | A7 | E7 | F7 | г | Икс | Икс | 7 |
8+ | C8 | A8 | E8 | F8 | ЧАС | у | Y | 8 |
9+ | C9 | A9 | E9 | F9 | я | z | Z | 9 |
0− | D0 | B0 | } (*) | ^ (*) | ||||
1− | D1 | B1 | J | |||||
2− | D2 | Би 2 | K | |||||
3− | D3 | B3 | L | |||||
4− | D4 | B4 | M | |||||
5− | D5 | B5 | N | |||||
6− | D6 | B6 | О | |||||
7− | D7 | B7 | п | |||||
8− | D8 | B8 | Q | |||||
9− | D9 | B9 | р |
(*) Примечание. Эти символы различаются в зависимости от настройки локальной кодовой страницы символов .
Некоторые языки (такие как COBOL и PL / I) напрямую поддерживают зонированные десятичные значения с фиксированной точкой, присваивая неявную десятичную точку в некотором месте между десятичными цифрами числа. Например, учитывая шестибайтовое зональное десятичное значение со знаком с подразумеваемой десятичной точкой справа от четвертой цифры, шестнадцатеричные байты F1 F2 F7 F9 F5 C0 представляют значение +1 279,50:
F1 F2 F7 F9 F5 C0 1 2 7 9. 5 +0
IBM использовала термины двоично-десятичный код обмена (BCDIC, иногда просто BCD) для 6-битных буквенно - цифровых кодов, представляющих числа, прописные буквы и специальные символы. Некоторые варианты буквенных обозначений BCDIC использовались в большинстве ранних компьютеров IBM, включая IBM 1620 (представленный в 1959 году), серию IBM 1400 и элементы недесятичной архитектуры серии IBM 700/7000 .
Серия IBM 1400 - это машины с символьной адресацией, каждая ячейка которых состоит из шести битов, помеченных B, A, 8, 4, 2 и 1, плюс бит проверки нечетности ( C ) и бит словарной метки ( M ). Для кодирования цифр с 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 , которая в формате перфокарты (12,1) , кодируется (B, A, 1) . Символ валюты $ , (11,8,3) в перфокарты, закодированных в памяти как (B, 8,2,1) . Это позволяет схемам выполнять преобразование между форматом перфокарты и форматом внутреннего хранилища очень простым с учетом лишь нескольких особых случаев. Один важный особый случай - цифра 0., представленный одиночным перфоратором 0 на карте и (8,2) в основной памяти. [43]
Память IBM 1620 организована в виде 6-битных адресных цифр, обычно 8, 4, 2, 1 плюс F , используемых как бит флага, и C , бит проверки нечетности. Буквенно-цифровые символы BCD кодируются с использованием пар цифр, где «зона» в разряде с четным адресом и «цифра» в разряде с нечетным адресом, «зона» связана с « штрихами зоны» 12 , 11 и 0 как в серии 1400. Аппаратные средства преобразования ввода / вывода преобразуют внутренние пары цифр во внешние стандартные 6-битные двоично-десятичные коды.
В десятичной архитектуре буквенные обозначения IBM 7070 , IBM 7072 и IBM 7074 кодируются с использованием пар цифр (с использованием кода два из пяти в цифрах, а не BCD) 10-значного слова с «зоной» в левая цифра и «цифра» в правой цифре. Аппаратные средства преобразования ввода / вывода преобразуют внутренние пары цифр во внешние стандартные 6-битные двоично-десятичные коды.
С появлением 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. [44]
Серия Digital Equipment Corporation VAX-11 включает инструкции, которые могут выполнять арифметические операции непосредственно с упакованными данными BCD и преобразовывать между упакованными данными BCD и другими целочисленными представлениями. [41] Упакованный формат BCD VAX совместим с форматом IBM System / 360 и более поздних совместимых процессоров IBM. В реализациях MicroVAX и более поздних VAX эта возможность отсутствует в ЦП, но сохранена совместимость кода с более ранними машинами за счет реализации отсутствующих инструкций в библиотеке программного обеспечения, поставляемой операционной системой. Это вызывается автоматически через обработку исключений, когда встречаются несуществующие инструкции, так что программы, использующие их, могут выполняться без изменений на новых машинах.
Архитектура Intel x86 поддерживает уникальный 18-значный (10-байтовый) формат BCD, который можно загружать и сохранять из регистров с плавающей запятой, откуда можно выполнять вычисления. [45]
Серия Motorola 68000 имела инструкции BCD. [46]
В более поздних компьютерах такие возможности почти всегда реализуются в программном обеспечении, а не в наборе команд ЦП, но числовые данные в формате BCD по-прежнему чрезвычайно распространены в коммерческих и финансовых приложениях. Существуют уловки для реализации упакованных операций BCD и зональных десятичных операций сложения или вычитания с использованием коротких, но трудных для понимания последовательностей логики параллельных слов и двоичных арифметических операций. [47] Например, следующий код (написанный на C ) вычисляет беззнаковое 8-значное упакованное BCD сложение с использованием 32-битных двоичных операций:
uint32_t BCDadd ( uint32_t a , uint32_t b ) { uint32_t t1 , t2 ; // беззнаковые 32-битные промежуточные значения t1 = а + 0x06666666 ; t2 = t1 ^ b ; // сумма без распространения переноса t1 = t1 + b ; // предварительная сумма t2 = t1 ^ t2 ; // все двоичные биты переноса t2 = ~ t2 & 0x11111110 ; // биты переносятся только в двоично-десятичном коде t2 = ( t2 >> 2 ) | ( t2 >> 3 ); // возврат коррекции t1 - t2 ; // исправленная сумма BCD }
В этом разделе есть несколько проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалить эти сообщения-шаблоны )
|
BCD очень распространен в электронных системах, где должно отображаться числовое значение, особенно в системах, состоящих исключительно из цифровой логики и не содержащих микропроцессор. Используя BCD, можно значительно упростить манипуляции с числовыми данными для отображения, если рассматривать каждую цифру как отдельную подсхему. Это гораздо больше соответствует физической реальности дисплейного оборудования - разработчик может использовать серию отдельных идентичных семисегментных дисплеев.например, построить схему учета. Если бы числовая величина хранилась и обрабатывалась как чисто двоичная, для взаимодействия с таким дисплеем потребовалась бы сложная схема. Следовательно, в случаях, когда вычисления относительно просты, работа с BCD может привести к более простой системе, чем преобразование в двоичную систему и обратно. Большинство карманных калькуляторов делают все свои расчеты в формате BCD.
Тот же аргумент применим, когда оборудование этого типа использует встроенный микроконтроллер или другой небольшой процессор. Часто внутреннее представление чисел в формате BCD приводит к меньшему размеру кода, поскольку преобразование из или в двоичное представление может быть дорогостоящим для таких ограниченных процессоров. Для этих приложений некоторые небольшие процессоры имеют специальные арифметические режимы, которые помогают при написании подпрограмм, управляющих величинами BCD. [48] [49]
Можно выполнить сложение , сначала добавив в двоичном формате, а затем преобразовав в BCD. Преобразование простой суммы двух цифр может быть выполнено путем добавления 6 (то есть от 16 до 10), когда пятибитовый результат добавления пары цифр имеет значение больше 9. Причина добавления 6 заключается в том, что есть 16 возможных 4-битных значений BCD (поскольку 2 4 = 16), но действительны только 10 значений (от 0000 до 1001). Например:
1001 + 1000 = 10001 9 + 8 = 17
10001 - это двоичное, а не десятичное представление желаемого результата, но наиболее значимая 1 («перенос») не может поместиться в 4-битное двоичное число. В двоично-десятичном формате, как и в десятичном, не может быть значения больше 9 (1001) на цифру. Чтобы исправить это, к общей сумме добавляется 6 (0110), а затем результат обрабатывается как два полубайта:
10001 + 0110 = 00010111 => 0001 0111 17 + 6 = 23 1 7
Два полубайта результата 0001 и 0111 соответствуют цифрам «1» и «7». Это дает "17" в двоично-десятичном формате, что является правильным результатом.
Этот метод можно расширить до добавления нескольких цифр, добавляя группы справа налево, распространяя вторую цифру как перенос, всегда сравнивая 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 является формой десятичного представления, некоторые приведенные выше суммы цифр недействительны. В случае, если существует недопустимая запись (любая цифра 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.
Существуют различные реализации BCD, в которых используются другие представления чисел. Программируемые калькуляторы производства Texas Instruments , Hewlett-Packard и других обычно используют формат BCD с плавающей запятой , как правило, с двумя или тремя цифрами для (десятичной) экспоненты. Дополнительные биты знаковой цифры могут использоваться для обозначения специальных числовых значений, таких как бесконечность , недостаточное / переполнение и ошибка (мигающий дисплей).
Знаковые десятичные значения могут быть представлены несколькими способами. COBOL языка программирования, например, поддерживает пять зональных десятичных форматов, с каждым из кодирующего числовой знак по-другому:
Тип | Описание | Пример |
---|---|---|
Без подписи | Нет знака клев | F1 F2 F3 |
Подписанный трейлинг (канонический формат) | Подпись полубайта в последнем (наименее значимом) байте | F1 F2 C3 |
Подписанный ведущий (оверпанш) | Подпишите полубайт в первом (наиболее значимом) байте | C1 F2 F3 |
Подписанный конечный отдельный | Отдельный байт знакового символа ( '+' или '−' ), следующий за байтами цифры | F1 F2 F3 2B |
Подпись ведущая отдельная | Отдельный байт знакового символа ( '+' или '−' ), предшествующий байтам цифры | 2B F1 F2 F3 |
3GPP разработал TBCD , [51] разложение в BCD , где остальные (неиспользованная) комбинация бит используется для добавления конкретных телефонных символов, [52] [53] с цифрами , похожими на те , что в телефонных клавиатурах оригинального дизайн.
Десятичная цифра | TBCD 8 4 2 1 |
---|---|
* | 1 0 1 0 |
# | 1 0 1 1 |
а | 1 1 0 0 |
б | 1 1 0 1 |
c | 1 1 1 0 |
Используется как заполнитель при нечетном количестве цифр | 1 1 1 1 |
Упомянутый документ 3GPP определяет TBCD-STRING с переставленными полубайтами в каждом байте. Биты, октеты и цифры, проиндексированные с 1, биты справа, цифры и октеты слева.
бит 8765 октета n кодирование цифра 2 n
биты 4321 октета n, кодирующая цифру 2 ( n - 1) + 1
Значение числа 1234
, превратится 21 43
в TBCD.
Если ошибки в представлении и вычислении более важны, чем скорость преобразования в отображение и обратно, может использоваться масштабированное двоичное представление, в котором десятичное число хранится в виде целого числа в двоичной кодировке и десятичной экспоненты со знаком в двоичной кодировке. Например, 0,2 можно представить как 2 × 10 - 1 .
Такое представление допускает быстрое умножение и деление, но может потребовать сдвига в степени 10 во время сложения и вычитания для выравнивания десятичных знаков. Это подходит для приложений с фиксированным числом десятичных знаков, которые не требуют такой настройки, особенно для финансовых приложений, где обычно достаточно 2 или 4 цифр после десятичной точки. Действительно, это почти форма арифметики с фиксированной точкой, поскольку подразумевается положение точки счисления .
В Hertz и кодирование Чена-Ho обеспечивает булевы преобразования для преобразования группы из три BCD-кодированных цифр и из 10-битовых значений [NB 1] , которые могут быть эффективно закодированы в аппаратных средств только с 2 или 3 задержкой затвора. Плотно упакованная десятичная дробь (DPD) представляет собой аналогичную схему [nb 1], которая используется для большей части мантиссы , за исключением ведущей цифры, для одного из двух альтернативных десятичных кодировок, указанных в стандарте IEEE 754-2008 для чисел с плавающей запятой.
BIOS во многих персональных компьютерах хранят даты и время в BCD , так как MC6818 в режиме реального время чип часов используются в оригинальном IBM PC AT материнская плата при условии , что время , закодированном в BCD. Эта форма легко конвертируется в ASCII для отображения. [54] [55]
Семейство 8-битных компьютеров Atari использовало двоично-десятичный код для реализации алгоритмов с плавающей запятой. Процессор MOS 6502 имеет режим BCD, который влияет на инструкции сложения и вычитания. Программное обеспечение карманного компьютера Psion Organizer 1 , поставляемое производителем, также полностью использует BCD для реализации операций с плавающей запятой; более поздние модели Psion использовали исключительно двоичные файлы.
Ранние модели PlayStation 3 хранят дату и время в BCD. Это привело к отключению консоли во всем мире 1 марта 2010 года. Последние две цифры года, сохраненные как BCD, были неверно интерпретированы как 16, что привело к ошибке в дате устройства, что сделало большинство функций неработоспособными. Это было названо проблемой 2010 года .
В 1972 случае Gottschalk v. Бенсон , то Верховный суд США отменил нижестоящий суд решения о том , что он позволявший патенте для преобразования BCD-кодированных чисел в двоичный на компьютере. В решении отмечалось, что патент «полностью заменит математическую формулу и на практике будет патентом на сам алгоритм ». [56] Это было эпохальное решение, определяющее патентоспособность программного обеспечения и алгоритмов.
[…] Die nicht erlaubten 0/1-Muster nennt man auch Pseudodezimalen. […](320 страниц)
[…] Последний столбец [Таблицы II], помеченный как «Наилучшее», дает максимально возможную дробь с любым кодом, а именно 0,60, что вдвое лучше, чем с любым обычным кодом. Эта экстремальная ситуация достигается с помощью десяти [сильно отмеченных вершин графа на рис. 4 для n = 4, или, фактически, с любым набором из десяти кодовых комбинаций, которые включают все восемь с четным (или все восемь с нечетным ) количество "единиц". Во второй и третьей строках таблицы II перечислены среднее и пиковое десятичное изменение на одну необнаруженную одиночную двоичную ошибку, и они были получены с использованием уравнений разд. II для Δ 1 и δ 1 . Индекс путаницы для десятичных знаков с использованием критерия «десятичной замены» принимается равным c ij= | i - j | i, j = 0, 1,… 9. Опять же, «наилучшее» возможное расположение (то же самое для среднего и пикового), одно из которых показано на рис. 4, существенно лучше традиционных кодов. […] Рис. 4 Код минимальной путаницы для десятичных знаков . […] Δ 1 = 2 Δ 1 = 15 […][1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] (11 страниц ») (NB. Помимо комбинаторного набора 4-битного BCD» коды минимальной путаницы для десятичных дробей », из которых автор в явном виде иллюстрирует только один (здесь воспроизводится как код I ) в форме 4-битного графа, автор также показывает 4-битный« двоичный код для аналоговых данных »с 16 состояниями. в виде кодовой таблицы, которая, однако, здесь не обсуждается. Показанный здесь код II является модификацией кода, который я обсуждал Бергером .)
[…] Циклический код выгоден, главным образом, при использовании релейных схем, поскольку в этом случае залипающее реле не будет давать ложное состояние, поскольку оно задерживается при переходе от одного циклического номера к другому. Есть много других циклических кодов, обладающих этим свойством. […][12] (xxiv + 835 + 1 страницы) (NB. Ледли классифицировал описанный циклический код как циклический двоичный код с десятичным кодированием .)
[…] При работе с целыми числами BCD в регистрах
общего назначения
значения BCD могут быть распакованы (одна цифра BCD на байт) или упакована (две цифры BCD на байт). Значение распакованного целого числа BCD - это двоичное значение
младшего полубайта.
(биты с 0 по 3). Старший полубайт (биты с 4 по 7) может иметь любое значение во время сложения и вычитания, но должен быть равен нулю во время умножения и деления. Упакованные целые числа BCD позволяют содержать две цифры BCD в одном байте. Здесь цифра в старшем полубайте более значима, чем цифра в младшем полубайте. […] При работе с целыми числами BCD в регистрах данных FPU x87 , значения BCD упаковываются в 80-битном формате и называются десятичными целыми числами. В этом формате первые 9 байтов содержат 18 цифр BCD, по 2 цифры на байт. Наименее значимая цифра содержится в нижней половине байта байта 0 и наиболее значимая цифра содержится в верхней половине байта байта 9. самый старший бит байта 10 содержитзнаковый бит (0 = положительный и 1 = отрицательный; биты с 0 по 6 байта 10 - это неважные биты). Отрицательные десятичные целые числа не хранятся в форме дополнения до двух ; они отличаются от положительных десятичных целых чисел только знаковым битом. Диапазон десятичных целых чисел, которые могут быть закодированы в этом формате, составляет от -10 18 + 1 до 10 18 - 1. Десятичный целочисленный формат существует только в памяти. Когда десятичное целое число загружается в регистр данных x87 FPU, оно автоматически преобразуется в формат с плавающей запятой двойной расширенной точности . Все десятичные целые числа точно представлены в формате двойной расширенной точности. […][13]