数制

1.常见的数制

十进制:逢十进一

二进制:逢二进一

八进制:逢八进一

十六进制:逢十六进一,10~15的值用字母A~F表示。

为了区别这些进制数,在数的后面加上一个字母加以区分,用B表示二进制数制;D或不带字母表示十进制数制;H表示十六进制数制。

2.进制间的转换

1.十进制转换成二进制

1.整数部分

方法为:十进制数除2取余法,即十进制数除2,余数为权位上的数,得到的商值继续除2,依此步骤继续向下运算直到商为0为止。

(具体用法如下图)

二进制、八进制、十进制、十六进制之间的转换

2.小数部分

方法:乘2取整法,即将小数部分乘以2,然后取整数部分,剩下的小数部分继续乘以2,然后取整数部分,剩下的小数部分又乘以2,一直取到小数部分 
为零为止。如果永远不能为零,就同十进制数的四舍五入一样,按照要求保留多少位小数时,就根据后面一位是0还是1,取舍,如果是零,舍掉,如果是1,向入一位。换句话说就是0舍1入。读数要从前面的整数读到后面的整数,下面举例: 
例1:将0.125换算为二进制 

得出结果:将0.125换算为二进制(0.001)2 
分析:第一步,将0.125乘以2,得0.25,则整数部分为0,小数部分为0.25; 
第二步, 将小数部分0.25乘以2,得0.5,则整数部分为0,小数部分为0.5; 
第三步, 将小数部分0.5乘以2,得1.0,则整数部分为1,小数部分为0.0; 
第四步,读数,从第一位读起,读到最后一位,即为0.001。 

例2,将0.45转换为二进制(保留到小数点第四位) 
大家从上面步骤可以看出,当第五次做乘法时候,得到的结果是0.4,那么小数部分继续乘以2,得0.8,0.8又乘以2的,到1.6这样一直乘下去,最后不可能得到小数部分为零,因此,这个时候只好学习十进制的方法进行四舍五入了,但是二进制只有0和1两个,于是就出现0舍1入。这个也是计算机在转换中会产生误差,但是由于保留位数很多,精度很高,所以可以忽略不计。 
那么,我们可以得出结果将0.45转换为二进制约等于0.0111 
上面介绍的方法是十进制转换为为二进制的方法,需要大家注意的是: 
1) 十进制转换为二进制,需要分成整数和小数两个部分分别转换 
2) 当转换整数时,用的除2取余法,而转换小数时候,用的是乘2取整法 
3) 注意他们的读数方向 
因此,我们从上面的方法,我们可以得出十进制数168.125转换为二进制为10101000.001,或者十进制数转换为二进制数约等于10101000.0111。 

2.二进制转换成十进制

方法:按权相加法,即将二进制每位上的数乘以权,然后相加之和即是十进制数。例 
将二进制数101.101转换为十进制数。 
得出结果:(101.101)2=(5.625)10 
大家在做二进制转换成十进制需要注意的是 
1) 要知道二进制每位的权值 
2) 要能求出每位的值 

注意:对于二进制转换成八进制,二进制转换成十六进制,八进制转换成十进制等低进制转换成高进制的形式,此方法都试用。

3.二进制转换成八进制

方法为:3位二进制数按权展开相加得到1位八进制数。(注意事项,3位二进制转成八进制是从右到左开始转换,不足时补0)。

(具体用法如下图)

二进制、八进制、十进制、十六进制之间的转换

4.八进制转换成二进制

方法为:

1.八进制数通过除2取余法,得到二进制数。

2.对每个八进制为3个二进制,不足时在最左边补零。

(具体用法如下图)

二进制、八进制、十进制、十六进制之间的转换

5.二进制转换成十六进制

方法为:与二进制转八进制方法近似,八进制是取三合一,十六进制是取四合一。(注意事项,4位二进制转成十六进制是从右到左开始转换,不足时补0)。

(具体用法如下图)

二进制、八进制、十进制、十六进制之间的转换

6.十六进制转换成二进制

方法为:

1.十六进制数通过除2取余法,得到二进制数。

2.对每个十六进制为4个二进制,不足时在最左边补零。

(具体用法如下图)

二进制、八进制、十进制、十六进制之间的转换

3.有符号二进制

有符号二进制数最左边一位为符号位,0表示正数,1表示负数。有符号二进制数可以用原码,反码,补码来表示。

1.原码

原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:

[+1] = 0000 0001

[-1] = 1000 0001

第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:

[1111 1111 , 0111 1111]

[-127 , 127]

原码是人脑最容易理解和计算的表示方式.

2.反码

反码的表示方法是:

正数的反码是其本身

负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.

[+1] = [00000001] = [00000001]

[-1] = [10000001] = [11111110]

可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算.

3.补码

补码的表示方法是:

正数的补码就是其本身

负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)

[+1] = [00000001] = [00000001] = [00000001]

[-1] = [10000001] = [11111110] = [11111111]

对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值.

4.原码和补码间的转换

1.原码转换成补码

方法一:符号位不变,数值位按位取反,末位再加1。

X=-4   [X]原 = 10000100  [X]补 = 11111100B

方法二:快速求法,将负数原码的最前面的1和最后面一个之前的每一位取反。

X=-4   [X]原 = 10000100  [X]补 = 11111100B

2.补码转换成原码

方法一:符号位不变,数值位按位取反,末位再加1。

X=-4    [X]补 = 11111100B     [X]原 = 10000100  

方法二:快速求法,将负数补码的最前面的1和最后面一个之前的每一位取反。

X=-4     [X]补 = 11111100B      [X]原 = 10000100 

4.浮点型二进制

浮点数包括float和double两种类型,float占32位,double占64位。其二进制存储格式遵循IEEE754标准。以float为例:

      符号位:正数为0,负数为1。

计算步骤:

1.首先计算小数的二进制。

2.将小数二进制转换成指数形式。

转换规则:将小数点移动到第一个1的右边,左移几位就是乘以2的几次幂。

3.将小数的符号位存在float的第一位,0为正数,1为负数。指数部分加上偏移量(float的偏移量为127),存入8为阶码位,将指数形式的二进制小数部分存入尾数位,如果位数不够后面用0补齐。

参考资料

【1】https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html

【2】https://jingyan.baidu.com/article/495ba84109665338b30ede98.html

【3】https://www.cnblogs.com/lds85930/archive/2007/09/19/897912.html

原文地址:https://www.cnblogs.com/lty1661489001/p/11575275.html