2021-08-29 C语言之进制转换

1、二进制用数字0,1表示,原则是逢二进一,十进制数进位原则是逢十进一,此外计算机常用的还有八进制数,十六进制数。

不同数值之间的转换依据就是:不同数制的每一位所对应的权值不同。

解释一下什么是权值:

权值就是处在某一位上的“1”所表示的数值的大小,称为该位的位权。

比如,1010(2)表示一个二进制数,它的每一位的权值从右往左依次递增,最右边的数字0,在这个数的第0位,所以该位的权值是20

这里强调一下:在数一个数的某一位时,从右往左依次是第0,1,2,3.…位。要从0开始数。这个数在第几位,它的权值就是几次幂。

从右往左数第二个数字是1,但是它不是第二位,它是第1位,所以它的权值是21

所以1010(2)这个二进制数转换为十进制数就是每一位上的数乘以他们所对应的权值:0*20+1*21+0*22+1*23=10(10)

所以1010(2)这个二进制数用十进制数表示就是10。

还有就是二进制小数的转换,比如10.1010(2)转换为十进制数:10.1010(2)=1*21+1*2-1+1*2-3=2.625(10)

这里要注意小数部分的权值与整数部分不同,以二进制为例,小数部分从左往右依次是(从1开始)第一位、第二位…那么每一位所对应的的权值是2-1

第二位是2-2……

2、八进制数:它的权值:第0位是80,第1位是81,……

比如一个八进制数:567(8),它转换为十进制数是:7*80+6*81+5*82=375

八进制小数的转换,同二进制。

3、十六进制数:它的权值:第0位是160,第1位是161,……

十六进制因为某一位的最大数值可以是15,但是在某一位上又不可能用2位数表示,所以(习惯上)用大写英文字母A~F表示从10~15这六个2位数。

即:A=10 , B=11 , C=12 , D=13 , E=14 , F=15。

比如一个十六进制数:4F5,转换为十进制数为:4F5=5*160+F*161+4*162=1269(10)

十六进制小数的转换,同二进制。比如90.1(16)=9*161+1*16-1=144.0625(10)

以上是二、八、十六进制----->十进制。

4、那么十进制数----->二、八、十六进制数,接下来介绍。

十进制数转换为二进制数时,由于整数和小数转换方法不同,所以要把十进制数的整数和小数部分分别转换后加以合并。

十进制整数转二进制数采用:除2取余,逆序排列。将要转换的数除以2,得到商和余数,继续把商除以2,直到商为0,最后将余数逆序排列。

十进制小数转二进制数采用:乘2取整,正序排列。将要转换的小数乘以2,取出积的整数部分,再用余下的小数继续乘以2,再取出积的整数部分,这样进行到积的小数部分为0,或达到所要求的精度为止。

有些十进制小数无法用二进制精确的表达,转化时符合一定的精度即可,这是计算机浮点数运算不准确的原因。

十进制转换八进制同上。

十进制转换十六进制同上。

5、快速转换法,利用8421码:只适用于二、八、十六进制之间的转换。

二进制快速转换为八进制数:101(2)从右往左依次对应8421码的后三位1、2、4,因为4+2+1=7,正好是八进制数位的最大值7,所以每3位二进制表示一位八进制数。所以多位二进制数在转换时要从右往左,3位一组,最后如果不够3位补0即可。

如果二进制位某位的数值为1,则对应该位的8421码数值相加,如果二进制位某位的数值为0,则对应该位的8421码等于0,不用加。

101(2)=1+4=5(8)

二进制快速转换为十六进制数:1101(2)从右往左依次对应8421码的1、2、4、8,因为8421码4位数相加:1+2+4+8=15,正好对应十六进制数位上的最大值15,所以每4位二进制数表示一位十六进制数。所以多位二进制数在转换时要从右往左,4位一组,最后如果不够4位补0即可。

1101(2)=1+4+8=13=D(16)

相反的,利用8421码也可以完成对八、十六进制转换二进制的快速转换。

特别的:

如果一个八进制数要转换为十六进制数,不能直接转换,要先把八进制数转为二进制,再由二进制转为十六进制。

如果一个十六进制数要转换为八进制数,不能直接转换,要先把十六进制数转为二进制,再由二进制转为八进制。

end.

2021-08-29 C语言之进制转换

上一篇:Java入门知识梳理01


下一篇:中文编码GBK---执行 javac 无法出现class文件