1.9 数字码制的表示和转换
本节将介绍不同数字码制的表示和在不同码制之间转换数字的方法。
1.9.1 数字码制表示
正如前面所介绍的那样,数字逻辑工作在开关状态下,即二进制状态。为了满足不同的运算需求,人们又定制了使用八进制、十进制和十六进制表示数字的规则。其中,十进制是日常生活中经常使用到的一种表示数字的方法。
1.二进制码制
二进制是以2为基数的进位制,即逢2进位。在二进制中,0和1是基本的数字。现代电子计算机采用二进制体系,因为它只使用0和1两个数字符号,易于用半导体元器件实现,因此简单方便。
2.十进制码制
十进制是以10为基数的进位制,即逢10进位。在十进制表示的数字中,只出现0~9这十个数字,0~9的数字组合可以用于表示任何一个数字。用十进制码制表示的数字,其运算规律满足“逢十进一”的规则。
3.八进制码制
八进制是以8为基数的进位制,即逢8进位。在八进制表示的数字中,只使用数字0~7。当把二进制数转换为八进制数时,可以将3个连续的数字拼成1组,然后再独立转成八进制的数字。例如,(74)10对应于二进制数“1001010”;3个连续的数字拼成1组变成1,001,010,表示八进制数(112)8。
4.十六进制码制
十六进制是以16为基数的进位制,即逢16进位。在16进制表示的数字中,用数字0~9和字母A~F(大写和小写均可)表示(其中,字母A~F对应于十进制数的10~15)。
表1.25给出了不同进制数之间的对应关系,这种对应关系只限制在非负的整数范围内。对于负整数的对应关系,将在第2章介绍减法器时进行详细说明。
表1.25 不同进制数之间的对应关系
续表
为了方便理解,下面说明不同进制的表示方法。
(1)对于一个4位的十进制数7531,用10的幂表示为
(2)对于一个5位的二进制数10101,用2的幂表示为
其等效于十进制数21。
(3)对于一个4位的十六进制数13AF,用16的幂表示为
1×163+3×162+10(等效于A)×161+15(等效于F)×160
其等效于十进制数5039。
推广总结如下。
(1)对于一个N位的二进制数,最低位为第0位,最高位为第N-1位,其计算公式为
Y=SN-1·2N-1+SN-2·2N-2+…+S1·21+S0
其中,Si为第i位二进制数的值,取值为0或1;2i为第i位二进制数所对应的权值;Y为等效的十进制数。
(2)对于一个N位的十六进制数,最低位为第0位,最高位为第N-1位,其计算公式为
Y=SN-1·16N-1+SN-2·16N-2+…+S1·161+S0
其中,Si为第i位十六进制数的值,取值范围为0~9,A~F;16i为第i位十六进制数对应的权值;Y为等效的十进制数。
前面介绍了使用其他进制表示十进制整数的方法。那么,对于一个十进制的小数,又该如何表示呢?
(1)对于一个3位的十进制小数0.714,用10的幂表示为
7×10-1+1×10-2+4×10-3
(2)对于一个5位的二进制小数0.10101,用2的幂表示为
1×2-1+0×2-2+1×2-3+0×2-4+1×2-5
其等效于十进制小数0.65625。
推广总结如下。
(1)对于一个N位的二进制小数,最高位为第0位,最低位为第N位,其计算公式为
Y=S0·2-1+S1·2-2+…+SN-2·2-(N-1)+SN-1·2-N
其中,Si为第i位二进制小数的值,取值为0或1;2-(i+1)为第i位二进制小数所对应的权值;Y为等效的十进制小数。
从上面的计算过程可知,二进制整数和二进制小数的区别是二进制整数的权值为整数,而二进制小数的权值为小数。
对于一个即包含整数又包含小数的二进制数来说,就是将整数部分和小数部分分别用整数二进制计算公式和小数二进制计算公式表示。
1.9.2 数字码制之间的转换
整数部分,把十进制转成二进制一直分解至商数为0。从最低的左边数字开始读,然后读右边的数字,从低位读到高位。小数部分,则用其乘2,取其整数部分的结果,然后再用计算后的小数部分依次重复计算,算到小数部分全为0为止,之后读取所有计算后整数部分的数字,从高位读到低位。
1.十进制数转二进制数
本节将介绍十进制数转二进制数的方法。下面以十进制数59转换为所对应的二进制数为例。
1)整数部分的计算方法
59÷2=29...1(前面表示商,后面表示余数)
29÷2=14...1
14÷2=7...0
7÷2=3...1
3÷2=1...1
1÷2=0...1
即整数部分59对应的二进制数为111011。
2)小数部分的计算方法
0.8125×2=1.625 取出整数1
0.625×2=1.25 取出整数1
0.25×2=0.5 取出整数0
0.5×2=1.0 取出整数1
即小数部分0.8125对应的二进制数为0.1101。因此,(59.8125)10=(111011.1101)2。
2.十进制数转十六进制数
本节将介绍十进制数转十六进制数的方法。下面以十进制数4877转换为所对应的十六进制数为例。
4877÷16=304...13(D)
304÷16=19...0
19÷16=1...3
1÷16=0...1
因此,(487710)10=(130D)16。
可以使用比较法将十进制数转换为二进制数,该方法比传统的转换方法容易理解和记忆,因此推荐使用这种方法。下面使用比较法将十进制数59.8125转换为对应的二进制数,转换过程如表1.26所示。
表1.26 使用比较法将十进制数转换成对应的二进制数
其中:
(1)最大的权值应该小于所要比较的十进制数,并且离该十进制数距离最近。
(2)权值从大到小依次递减排列。整数部分的权值表示为2i(i为非负整数),小数部分的权值表示为2-i(i为负整数)。
比较规则描述如下。
(1)将十进制数与所对应的权值进行比较。
① 当十进制数大于权值时,对应的二进制数值为1。用十进制数减去对应的权值,得到余数,该余数作为下一次比较的十进制数。
② 当十进制数小于权值时,对应的二进制数值为0。不做减法操作,该十进制数仍旧作为下一次比较的十进制数。
③ 当余数为0时,比较过程结束。
(2)权值20(1)之前(包括20)所有权值对应的二进制数,按权值从高位到低位依次排列,得到整数部分。在该例子中,整数部分对应的二进制数表示为111011。
(3)权值20(1)之后(不包括20)所有权值对应的二进制数,按权值从高位到低位依次排列,得到小数部分。在该例子中,小数部分对应的二进制数表示为1101。
因此,十进制正数59.8125对应的二进制数为111011.1101。
思考与练习1-43:完成下面整数的转换(使用最少的位数)。
(1)(35)10=(________)2=(________)16=(________)8
(2)(213)10=(________)2=(________)16=(________)8
(3)(1034)10=(________)2=(________)16=(________)8
思考与练习1-44:完成下面小数的转换(使用最少的位数)。
(1)(13.076)10=(________)2
(2)(247.0678)10=(________)2