
概述
标记方法:
十进制数: '1234'd
中 个位数字4,十位数字3,百位数字2,千位数字1,都是十进制数的一位,称为十进制位。
BCD(Binary Coded Decimal)码,是指用二进制数对十进制数进行的编码,每个十进制位由一个固定bit的二进制数表示。
非压缩BCD(unpacked BCD): 指一个字节(8 bits)表示一个十进制位。
压缩BCD(pBCD(packed BCD)): 指半字节(nibble, 4 bits)表示一个十进制位。
当然也有一些特殊模式来表示符号位或者错误、溢出等其他信息。
基础 Basics
最常见的BCD码称为8421码,用4个bit来表示一个十进制位,这种BCD也称为”natural BCD(NBCD)”.
还有其他编码方式,如”4221” 或者 “7421”.
这些表示方法的命名方法使用了每个位的权重(weighting)。
Decimal Digit | BCD 8421 | BCD 4221 | BCD 8 4 -2 -1 | ASCII 8421 |
---|---|---|---|---|
0 | 0 0 0 0 | 0 0 0 0 | 0 0 0 0 | 00110000 |
1 | 0 0 0 1 | 0 0 0 1 | 0 1 1 1 | 00110001 |
2 | 0 0 1 0 | 0 0 1 0 | 0 1 1 0 | 00110010 |
3 | 0 0 1 1 | 0 0 1 1 | 0 1 0 1 | 00110011 |
4 | 0 1 0 0 | 1 0 0 0 | 0 1 0 0 | 00110100 |
5 | 0 1 0 1 | 1 0 0 1 | 1 0 1 1 | 00110101 |
6 | 0 1 1 0 | 1 1 0 0 | 1 0 1 0 | 00110110 |
7 | 0 1 1 1 | 1 1 0 1 | 1 0 0 1 | 00110111 |
8 | 1 0 0 0 | 1 1 1 0 | 1 0 0 0 | 00111000 |
9 | 1 0 0 1 | 1 1 1 1 | 1 1 1 1 | 00111001 |
非压缩BCD使用8个bit来表示1个十进制位:
1 | Decimal: 6 2 8 |
在非压缩BCD中高4位全是0,可以记为00008412码
;
压缩BCD利用了8421码只使用4为就可以表示0-9,所以只用4位表示一个十进制位,压缩了数据, 提高了压缩效率。
1 | Decimal: 6 2 8 |
由于计算机中以字节为最小访问单位,压缩BCD中半字节需要补全为一个字节。如上例中628,其实是0628.
有符号数 Signed Integer
非压缩BCD表示方法
S0008421BCD
的最高bit位是符号位,为0认为是正数,为1则为负数。
1 | Decimal: -13 |
压缩BCD表示方法
对于有符号数,需要用一个半字节来表示符号。
Sign Digit | BCD 8421 | Sign | Note |
---|---|---|---|
A | 1 0 1 0 | + | |
B | 1 0 1 1 | - | |
C | 1 1 0 0 | + | EBCDIC |
D | 1 1 0 1 | - | EBCDIC |
E | 1 1 1 0 | + | |
F | 1 1 1 1 | - | |
EBCDIC字符集使用C为+,D为-,使用大端模式,最低半字节表示符号。 |
1 | number: -1234 |
浮点数 Float
浮点数可以使用约定俗成的方法来表示,如约定小数点后只有2位。
123C表示+1.23;100D表示+1.00
应用
在一些时钟芯片的寄存器采用BCD码形式输出。0x12,0x34,0x56可以表示12:34:56.
如M41T0 real time clock的日期和时间格式都是以压缩BCD码表示。

Reference: