2.3 二进制编码的十进制数

2.3.1 BCD码的编码方法

在计算机内部采用二进制形式表示数,但人们习惯使用十进制数。BCD码,是二进制编码的十进制数的简称,是为了便于人机交往而设计的一种数字编码。BCD码的编码规则是:用4位二进制数字表示1位十进制数字。在十进制数码与4位二进制编码表示的数之间选择不同的对应规律,就可以得到不同形式的编码。常用的BCD码有:8421BCD码、余3码、格雷码等。由于80x86微型计算机中支持8421BCD码的运算,故本书仅介绍8421BCD码。

1.8421BCD码的编码规则

8421BCD码的4位二进制数码的位权分别是:8,4,2,1,8421BCD码的名称也就是由此而来的。将每位数码与对应的权相乘求和,就是它代表的十进制的数值。十进制数与8421BCD码的对应关系见表2-5。

8421BCD编码的优点是:十进制数的每一位表示法与该数的二进制形式一样,容易识别。缺点是:1010~1111这6个编码没有用到,是无意义的编码。因此,运算结果如果落到这6个编码的范围内时,则需要经过调整后,才能得到正确的结果。在80X86微型计算机中,这种调整操作通过十进制调整指令实现。

表2-5 十进制数与8421BCD码的对应关系如表

2.8421BCD码的格式

8421BCD码有压缩(组合)BCD码和非压缩(非组合)BCD码两种格式。

(1)压缩8421BCD码

压缩8421BCD码用4位二进制数表示1位十进制数。一字节可以表示两位十进制数。例如,96D的压缩8421BCD码是:10010110。

(2)非压缩8421BCD码

非压缩8421BCD码用一字节的低4位表示1位十进制数,高4位任意,通常设为0000。例如,96D的非压缩8421BCD码是:0000100100000110。

2.3.2 8421BCD码的加、减运算

1.压缩8421BCD码的加、减运算

进行压缩8421BCD码的加、减运算时,参与运算的操作数为压缩8421BCD码,结果也是压缩8421BCD码。

下面举例说明压缩8421BCD码的加、减运算及十进制调整方法。

【例2-12】 计算用压缩8421BCD码表示的两个十进制数16和18的和。

第一步:做加法。

16D=00010110BCD,18D=00011000BCD。运算过程如下:

第二步:分析上式运算结果,进行十进制调整。

我们知道,16D+18D=34D,用压缩8421BCD码进行加法运算,结果应为00110100BCD。但上式运算的结果是00101110,其中的低位:1110,不是有效的压缩8421BCD码。造成这个问题的原因是,采用压缩8421BCD码运算时,运算器仍然进行的是二进制数的运算,采用的进位规则不是十进制运算规定的逢十进一,而是逢二进一。对应到本例中,就是个位上6和8相加,结果是14,大于9了,应该向十位有一个进位(逢十进一),但是实际这一进位并没有产生。

解决的办法是:将出错的那一位压缩8421BCD码与6相加。相加后如果产生进位,则该进位应该加到压缩8421BCD码的高位。

【例2-13】 计算用压缩8421BCD码表示的两个十进制数39和98的和。

39D=00111001BCD,98D=10011000BCD。

【例2-14】 计算用压缩8421BCD码表示的两个十进制数35和16的差。

35D=00110101BCD,16D=00010110BCD。

压缩8421BCD运算的十进制调整规则如下:

(1)加法运算后的十进制调整规则

  • 若加法和的个位大于9或向十位有进位,则需要“加06H调整”,即所得和要加上0000110B;
  • 若加法和的十位大于9或向百位有进位,则需要“加60H调整”,即所得和要加上01100000B。

(2)减法运算后的十进制调整规则

  • 若减法差的个位大于9或向十位有借位,则需要“减06H调整”,即所得差要减去00000110B;
  • 若减法差的十位大于9或向百位有进位,则需要“减60H调整”,即所得差要减去01100000B。

2.非压缩BCD码的加、减运算

进行非压缩BCD码的加、减运算时,参与运算的操作数为非压缩BCD数,结果也是非压缩BCD数。如果操作数为两位十进制数,则用两字节表示该十进制数。例如,16D+17D=33D应该描述成0000000100000110BCD+0000000100000111BCD=0000001100000011BCD。

下面举例说明非压缩8421BCD码的加、减运算及十进制调整方法。

【例2-15】 将用非压缩BCD码表示的两个十进制数8和7相加。

【例2-16】 将用非压缩BCD码表示的两个十进制数9和8相加。

综上所述,非压缩8421BCD码进行加减运算时,若和/差大于9或d3位向d4位有进位/借位时,就需要进行扩展调整。