顾名思义,二迚制编码的十迚制(BCD,Binary-Coded Decimal)格式可以将十进制值编码为二进制表示形式。常见的高级语言(例如C/C++、Pascal及Java)支持十进制值的不多。但支持十进制值的面向业务的编程语言(例如COBOL和许多数据库语言)很多。因此,如果要编写和数据库或支持十进制算术的语言交互的代码,就需要处理BCD表示形式。
BCD数值由一系列的半字节组成,每个半字节代表一个0~9的数值(BCD格式仅用了一半字节可以表示的16个值中的10个)。如图2-8所示,一个字节可以表示由两个十进制数字组成的数(0..99)。一个字可以表示4个十进制数字(0..9999)。一个双字最多可以表示8个十进制数字。
图2-8 一个字节的BCD数据表示形式
8位的BCD变量可以表示0~99的数值,而8位的二进制数值可以表示的范围为0~255。16位的二进制数值可以表示的范围为0~65,535,而16位BCD值可以表示的数值范围只有二进制的六分之一(0..9999)不到。然而,BCD格式的问题不只是存储效率低下,BCD值的计算往往也比二进制值的计算要慢。
BCD格式有两点可取之处:BCD数值的内部表示形式和十进制字符串表示形式之间的转换非常简单;使用BCD格式还可以非常方便地在硬件中对多位十进制值进行编码。例如拨号盘,每一个号码代表一个数字。由于这些原因,BCD格式在嵌入式系统(例如烤箱和闹钟)中使用得较多,但在通用计算机软件中使用得很少。
几十年前,人们认为BCD(或十进制)算术运算比二进制更精确。因此,重要的计算(例如货币单位的计算)经常会使用十进制算法。对于某些计算可能BCD结果更精确,但是对于大多数计算二进制结果更精确。这就是大多数现代计算机程序都以二进制形式表示数值(包括十进制值)的原因。例如,英特尔80x86浮点单元(FPU,Floating-Point Unit)就支持两条加载和存储BCD值的指令。FPU内部会将这些BCD值转换为二进制值,而BCD只是作为FPU的外部数据格式。这种方法产生的结果通常更精确。