BCD数据表示



2.13  BCD数据表示

虽然整数和浮点格式已经可以满足一般程序的数据表示需求,但是在一些特殊的情况下,其他的数字表示方式更加方便一些。在本节中,我们将对二进制编码的十进制(BCD)格式进行讨论,因为80x86 CPU为这种数据表示方式提供了少量的硬件支持。

BCD数值是由一些半字节组成的序列,每个半字节表示0~9中的某个数值。当然,也可以使用半字节来表示0~15中的数值;但是在每个半字节所能表示的16个不同数值中,BCD格式只使用了其中的10个。

BCD数值中的每个半字节表示一个十进制数字。因此,我们用一个字节(也就是两个数位)可以表示包含两个十进制数字的数值或者0~99内的数值(见图2-25)。用一个字,我们可以表示具有四个十进制数字的数值或者说0~9999内的数值。同样,使用一个双字,我们可以表示具有八个十进制数字的数值(因为在一个双字数值当中存在八个半字节)。

 
图2-25  存储器中BCD数据表示

正如您所看到的,BCD存储并没有有效利用存储器。例如,一个8位的BCD变量可以表示0~99内的数值,然而当保存二进制数值的时候,同样的8位可以表示0~255内的数值。同样,16位的二进制数值可以表示0~65535内的数值,而一个16位的BCD数值只能表示这些数值中的1/6(0~9999)。存储效率低还不是唯一的问题。BCD的计算往往比二进制的计算更慢。

在此,您可能想知道为什么会有人采用BCD格式。BCD格式确实存在两个优点:BCD数值的内部数字表示和它们的字符串表示之间进行转换是非常容易的;而且,在用硬件(例如,使用微型旋轮或者刻度盘)完成多位十进制数值的编码时,使用BCD码比使用二进制要容易得多。正是由于这两个原因,您很可能会在嵌入式系统(例如,微波炉、闹钟和核反应堆)中看到人们使用BCD码,但是却很少看到它们应用于一般的计算机软件中。

几十年以前,人们错误地认为涉及BCD码(或者只是"十进制")的算术运算比二进制运算更加精确一些。因此,他们通常都采用基于十进制的算术运算来执行那些重要的计算,比如美元和美分(或者其他的金融单位)的计算。虽然某些采用BCD码的计算能够产生更加精确的结果,但是这种说法在一般情况下是不正确的。事实上,对于大多数计算(甚至那些涉及定点十进制的算术运算)来说,二进制表示更加精确一些。因此,现在大多数的计算机程序都采用二进制格式来表示所有的数值。例如,Intel的80x86浮点单元(FPU)对两条用于存储和取出BCD数值的指令提供了支持。然而在内部,FPU将这些BCD数值转换为二进制表示,并采用二进制来执行所有的计算。它只将BCD码用作外部数据格式(也就是说,在FPU的外面)。这样一般就能产生更加精确的结果,与专门拥有一个能支持十进制计算的协处理器相比,它占用的硅片面积更小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值