(二)数制及其转换
数制是指用一组固定的符号和统一的规则来表示数值的方法。其中,按照进位方式计数的数制称为进位计数制。在日常生活中,人们习惯用的进位计数制是十进制,而计算机则使用二进制;除此以外,还包括八进制和十六进制等。顾名思义,二进制就是逢二进一的数字表示方法;以此类推,十进制就是逢十进一,八进制就是逢八进一等。
进位计数制中每个数码的数值不仅取决于数码本身,其数值的大小还取决于该数码在数中的位置,如十进制数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
或者
828.41=8×102+2×101+8×100+4×10-1+1×10-2
上式为数值按位权展开的表达式,其中10i称为十进制数的位权数,其基数为10,使用不同的基数,便可得到不同的进位计数制。设R 表示基数,则称为R进制,使用R个基本的数码,R i就是位权,其加法运算规则是“逢R进一”,则任意一个R进制数D均可以展开表示为
常用数制对照关系表
上式中的Ki为第i 位的系数,可以为0,1,2…R -1中的任何一个数,R i表示第i位的权。
在计算机中,为了区分不同进制的数,可以用括号加数制基数下标的方式来表示不同数制的数,例如,(492)10表示十进制数,(1001.1)2表示二进制数,(4A9E)16表示十六进制数,也可以用带有字母的形式分别表示为(492)D、(1001.1)B和(4A9E)H。在程序设计中,为了区分不同进制数,常在数字后直接加英文字母后缀来区别,如492D、1001.1B等。
计算机中常用几种进位数制的表示
下面将具体介绍4种常用数制之间的转换方法。
1.非十进制数转换为十进制数
将二进制数、八进制数和十六进制数转换为十进制数时,只需用该数制的各位数乘以各自对应的位权数,然后将乘积相加。用按位权展开的方法即可得到对应的结果。
将二进制数10110转换成十进制数。
先将二进制数10110按位权展开,然后将乘积相加,转换过程如下所示。
将八进制数232转换成十进制数。
先将八进制数232按位权展开,然后将乘积相加,转换过程如下所示。
将十六进制数232转换成十进制数。
先将十六进制数232按位权展开,然后将乘积相加,转换过程如下所示。
2.十进制数转换成其他进制数
将十进制数转换成二进制数、八进制数和十六进制数时,可将数值分成整数和小数分别转换,然后拼接起来。
例如,将十进制数转换成二进制数时,整数部分采用“除 2 取余倒读”法,即将该十进制数除以 2,得到一个商和余数(K 0),再将商数除以 2,又得到一个新的商和余数(K 1),如此反复,直到商为0时得到余数(K n-1),然后将得到的各次余数,以最后余数为最高位,最初余数为最低位依次排列,即Kn-1…K1K0,这就是该十进制数对应的二进制整数部分。
小数部分采用“乘 2 取整正读”法,即将十进制的小数乘以 2,取乘积中的整数部分作为相应二进制小数点后最高位K-1,取乘积中的小数部分反复乘2,逐次得到K-2K-3…K-m,直到乘积的小数部分为 0 或位数达到所需的精确度要求为止,然后把每次乘积所得的整数部分由上而下(即从小数点自左往右)依次排列起来(K-1K-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.二进制数转换成八进制数、十六进制数
二进制数转换成八进制数采用的转换原则是“3位分一组”,即以小数点为界,整数部分从右向左每3位为一组,若最后一组不足3位,则在最高位前面添0补足3位,然后将每组中的二进制数按权相加得到对应的八进制数;小数部分从左向右每 3 位分为一组,最后一组不足3位时,尾部用0补足3位,然后按照顺序写出每组二进制数对应的八进制数即可。
将二进制数1101001.101转换为八进制数。
转换过程如下所示。
得到的结果为(1101001.101)2= (151.5)8
二进制数转换成十六进制数采用的转换原则与上面的类似,采用的转换原则是“4 位分一组”,即以小数点为界,整数部分从右向左、小数部分从左向右每4位一组,不足4位用0补齐即可。
将二进制数101110011000111011转换为十六进制数。
转换过程如下所示。
得到的结果为(101110011000111011)2= (2E63B)16
4.八进制数、十六进制数转换成二进制数
八进制数转换成二进制数的转换原则是“一分为三”,即从八进制数的低位开始,将每一位上的八进制数写成对应的 3 位二进制数。如有小数部分,则从小数点开始,分别向左右两边按上述方法进行转换。
将八进制数162.4转换为二进制数。
转换过程如下所示。
得到的结果为(162.4)8= (001110010.100)2
十六进制数转换成二进制数的转换原则是“一分为四”,即把每一位上的十六进制数写成对应的4位二进制数即可。
将十六进制数3B7D转换为二进制数。
转换过程如下所示。
得到的结果为(3B7D)16= (0011101101111101)2