1.2.2 数制及其转换
数制是指用一组固定的数字符号和统一的规则来表示数值的方法。其中,按照进位方式计数的数制称为进位计数制。在日常生活中,人们习惯用的进位计数制是十进制,而计算机则使用二进制。除此以外,进位计数制还包括八进制和十六进制等。顾名思义,二进制就是“逢二进一”的数制;以此类推,十进制就是“逢十进一”,八进制就是“逢八进一”等。
计算机中常用的几种进位数制的表示
在进位计数制中,每个数码的数值大小不仅取决于数码本身,还取决于该数码在数中的位置。如十进制数828.41,整数部分的第1个数码“8”处在百位,表示800;第2个数码“2”处在十位,表示20;第3个数码“8”处在个位,表示8;小数点后第1个数码“4”处在十分位,表示0.4;小数点后第2个数码“1”处在百分位,表示0.01。也就是说,同一数码处在不同位置所代表的数值是不同的。数码在一个数中的位置称为数制的数位,数制中数码的个数称为数制的基数,十进制数有0、1、2、3、4、5、6、7、8、9共10个数码,其基数为10。每个数位上的数码符号代表的数值等于该数位上的数码乘一个固定值,该固定值称为数制的位权数。数码所在的数位不同,其位权数也不同。
无论在何种进位计数制中,数值都可写成按位权展开的形式,如十进制数828.41可写成
828.41=8×100+2×10+8×1+4×0.1+1×0.01 (1-1)
或者
828.41=8×102+2×101+8×100+4×10-1+1×10-2 (1-2)
常用数制对照关系表
式(1-1)和式(1-2)为将数值按位权展开的表达式,其中10i称为十进制数的位权数,其基数为10。使用不同的基数,可得到不同的进位计数制。假设R表示基数,则进位计数制为R进制,可使用R个基本的数码,Ri就是位权,其加法运算规则是“逢R进一”。任意一个R进制数D均可以展开表示为
式(1-3)中的Ki为第i位的系数;i的取值范围是[-m,n-1](m是小数部分的位数,n是整数部分的位数);Ri表示第i位的权。
在计算机中,可以用括号加数制基数下标的方式来表示不同数制的数。例如,(492)10表示十进制数,(1001.1)2表示二进制数,(4A9E)16表示十六进制数;也可以用带有字母的形式分别将其表示为(492)D、(1001.1)B和(4A9E)H。在程序设计中,常在数字后直接加英文字母来区分不同的进制数,如492D、1001.1B等。
下面将具体介绍4种常用数制相互转换的方法。
1. 非十进制数转换成十进制数
将二进制数、八进制数和十六进制数转换成十进制数时,只需用该数制的各个位数乘各自对应的位权数,然后将乘积相加,用按位权展开的方法即可得到对应的结果。
(1)将二进制数10110转换成十进制数
先将二进制数10110按位权展开,然后将乘积相加,转换过程如下所示:
(10110)2=(1×24+0×23+1×22+1×21+0×20)10
=(16+4+2)10
=(22)10
(2)将八进制数232转换成十进制数
先将八进制数232按位权展开,然后将乘积相加,转换过程如下所示:
(232)8=(2×82+3×81+2×80)10
=(128+24+2)10
=(154)10
(3)将十六进制数232转换成十进制数
先将十六进制数232按位权展开,然后将乘积相加,转换过程如下所示:
(232)16=(2×162+3×161+2×160)10
=(512+48+2)10
=(562)10
2. 十进制数转换成其他进制数
将十进制数转换成二进制数、八进制数和十六进制数时,可先将数值分成整数和小数部分,然后分别进行转换,再拼接起来。
例如,将十进制数转换成二进制数时,对整数部分和小数部分分别进行转换。整数部分采用“除2取余倒读”法,即将该十进制数除以2,得到一个商和余数K0;再用商除以2,又得到一个新的商和余数K1;如此反复,直到商为0时得到余数;将各次得到的余数,以最后一次的余数为最高位、第一次的余数为最低位依次排列,即…K1 K0,这就是该十进制数对应的二进制数的整数部分。
小数部分采用“乘2取整正读”法,即将十进制数的小数乘2,取乘积中的整数部分作为相应二进制数小数点后的最高位K−1;取乘积中的小数部分反复乘2,逐次得到K−2,K−3,…,K−m,直到乘积的小数部分为0或位数达到所需的精确度要求为止;然后把每次乘积所得的整数部分从小数点后自左往右依次排列(K-1 K−2…K−m),即所求二进制数的小数部分。
同理,将十进制数转换成八进制数时,整数部分“除8取余”,小数部分“乘8取整”;将十进制数转换成十六进制数时,整数部分“除16取余”,小数部分“乘16取整”。
提示 在进行小数部分的转换时,有些十进制小数不能转换为有限位的二进制小数,此时只能用近似值表示。例如,(0.57)10不能用有限位的二进制小数表示,如果要求保留5位小数,则(0.57)10≈(0.10010)2。
例如,将十进制数225.625转换成二进制数。用“除2取余倒读”法对整数部分进行转换,再用“乘2取整正读”法对小数部分进行转换,转换过程如下所示:
(225.625)10=(11100001.101)2
3. 二进制数转换成八进制数、十六进制数
(1)二进制数转换成八进制数
二进制数转换成八进制数的转换原则是“3位分一组”,即以小数点为界,整数部分从右向左每3位分为一组;若最后一组不足3位,则在最高位前面添0补足3位;然后将每组中的二进制数按权相加,得到对应的八进制数。小数部分从左向右每3位分为一组;最后一组不足3位时,尾部添0补足3位;然后按照顺序写出每组二进制数对应的八进制数。
将二进制数1101001.101转换为八进制数,转换过程如下所示:
得到的结果为:(1101001.101)2=(151.5)8
(2)二进制数转换成十六进制数
二进制数转换成十六进制数的转换原则是“4位分一组”,即以小数点为界,整数部分从右向左、小数部分从左向右每4位分为一组,不足4位时添0补齐。
将二进制数10111001100011.1011转换为十六进制数,转换过程如下所示:
得到的结果为:(10111001100011.1011)2=(2E63.B)16
4. 八进制数、十六进制数转换成二进制数
(1)八进制数转换成二进制数
八进制数转换成二进制数的转换原则是“一分为三”,即从八进制数的低位开始,将每一位上的八进制数写成对应的3位二进制数;如有小数部分,则从小数点开始,按上述方法分别向左右两边进行转换。
将八进制数162.4转换为二进制数,转换过程如下所示:
得到的结果为:(162.4)8=(1110010.1)2
(2)十六进制数转换成二进制数
十六进制数转换成二进制数的转换原则是“一分为四”,即把每一位上的十六进制数写成对应的4位二进制数。
将十六进制数3B7D转换为二进制数,转换过程如下所示:
得到的结果为:(3B7D)16=(11101101111101)2