任何一个人都不愿意学习不完整的知识,特别是在交了"全额"学费之后。试想花了不少钱买了一本汇编语言教材,到头来却只学到了部分指令,不得不再花钱买另一本新书才把指令学全,这真是一件令人遗憾的事。说实在的,连笔者都觉得遗憾。
出于这样的原因,笔者才写了这一章。不仅为了将没有学到的指令补上,而且也想多讨论一些比较重要的知识。当然也能免去读者多花学费的经济负担。
二进制数固然适合于机器进行处理,但是它并不适用于人类,即使是将其表示成十六进制形式也仍然不便于记忆理解。这样一来我们编制一些进行数学计算的程序就不得不解决十进制数与二进制数之间的转换问题,以便于我们输入数据和观察运算结果。
由此看来,如果能够使二进制数与十进制数之间的对应关系得以简化,或者利用二进制数的形式直接表达十进制数,那么就能使编程工作变得简单一些。
在前面我们已经讨论过二进制数与十进制数之间的转换方法,以四位二进制数为例,它与十进制数、十六进制数的对应关系如表10-1所示:
二进制 | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 |
十进制 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
十六进制 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
二进制 | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 |
十进制 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
十六进制 | 8 | 9 | A | B | C | D | E | F |
由表10-1我们可以看到十进制数0-9与二进制数0000-1001之间可以看作是固定的4对1的对应关系,即二进制数的4个数位对应十进制数一个数位。然而从10以后就变成了二进制数4个数位对应十进制数两个数位了。10以后的十进制数与二进制数的对应失去了直观性。
如何使大于10的十进制数与二进制数的对应关系变得很直观呢?不妨采用这样的方法:把十进制数10表示成一个八位二进制数00010000,其中高4位0001表示十位上的1,而低4位0000则表示个位上的0。也就是说对于十进制数的每一个数位我们都用一个4位二进制数来表示。
这样一来像56这样的十进制数就可以表示成01010110了,高4位0101对应十位的5,低4位0110就对应了个位的6。这显然要比56真正对应的那个二进制数00111000要好理解。同理,十进制数348就可以表示成001101001000,其中0011就是百位的3,0100对应十位的4,1000就是个位的8。其它的十进制数都可以仿照这个方法处理。
上面所讨论的这样一种编码方式一般被称为二-十进制编码(Binary Coded Decimal),简称为BCD编码。PC电脑实际所用的BCD编码规则稍微复杂一些,分为压缩BCD码与非压缩BCD码两种。压缩BCD编码就是上面我们讨论的编码方法,4位二进制数对应1位十进制数。非压缩BCD编码只是将4位二进制数扩展成了8位,但是高4位可以是任意数。以78为例,用压缩BCD码表示是01111000,而用非压缩BCD编码则是????0111????1000,?既可以是1也可以是0,没有任何关系。
这里出现了这样一个奇妙的规律,既然非压缩的BCD码高4位没有意义,那么78不妨可以表示为0011011100111000。细想一下00110111其实是一个字符对应的ASCII码,这个字符是什么呢?查一下ASCII码表即可得知这个字符就是7。同样00111000就是字符8。由来看来我们通过键盘输入的字符0-9所对应的ASCII码其实就是一种非压缩的BCD码。