本文已参与[新人创作礼]活动,一起开启掘金创作之路
一.进制转换
二进制:用B表示Binary的首字母只要0和1两个数字,逢二进1.在C语言中没有用ob(oB)开头表示。
十进制: 用D表示Decimal的首字母,用0~9数字表示,逢十进1,在C语言中默认情况下为十进制。
八进制: 用O表示Octal的首字母,用0~7数字表示,逢八进1,在C语言中用0开头表示。
十六进制:用H表示Hexadecimal的首字母,用字母0~9数字和字母(A-F)表示.在C语言中用ox(oX)开头表示。
1.二进制转为其他进制
<1>二进制转为十进制:
二进制数第0位的权值是2的0次方,第1位的权值是2的1次方……
所以,设有一个二进制数:0110 0100,转换为10进制为:
下面是竖式:
0110 0100 换算成十进制
第0位 0 *
= 0
第1位 0 *
= 0
第2位 1 *
= 4
第3位 0 *
= 0
第4位 0 *
= 0
第5位 1 *
= 32
第6位 1 *
= 64
第7位 0 *
= 0
和为100
用横式计算为:
0 *
+ 0 *
+ 1 *
+ 0 *
+ 0 *
+ 1 *
+ 1*
+ 0 *
= 100
<2>二进制转为八进制 十六进制(二进制转八进制和转十六进制的方法一样):
(11001)
整数部分: 从后往前每三位一组,缺位处用0填补, 则有:
001=1
011=3
故为31,那么这个31就是二进制11001的八进制形式
2.八进制转为其他进制
<1>八进制转为二进制:
此过程和二进制转八进制的过程相反
八进制数:372
2=010
7=111
3=011
故其二进制位11111010
<2>八进制转为十进制:
八进制数第0位的权值为8的0次方,第1位权值为8的1次方,第2位权值为8的2次方……
所以,设有一个八进制数:1507,转换为十进制为:
用竖式表示:
1507换算成十进制。
第0位 7 *
= 7
第1位 0 *
= 0
第2位 5 *
= 320
第3位 1 *
= 512
相加得
--------------------------
839
同样,我们也可以用横式直接计算:
7 *
+ 0 *
+ 5 *
+ 1 *
= 839
结果是,八进制数 1507 转换成十进制数为 839
<3>八进制转十六进制:
八进制不可直接转十六进制只可以间接转换(先将八进制转为其他进制,然后再转为十六进制)
3.十进制转为其他进制
<1>十进制转为二进制,八进制,十六进制(十进制转二进制,八进制,十六进制的方法一样):
十进制数除2取余法,即十进制数除2,余数为权位上的数,得到的商值继续除2,依此步骤继续向下运算直到商为0为止。
例如:把十进制数 150 转换为 二进制数:如下:
4.十六进制转为其他进制
<1>十六进制转为二进制:
十六进制转为二进制和二进制转为十六进制的过程相反
<2>十六进制转为八进制:
不可转,只可以间接转。
<3>十六进制转为十进制:
与二进制转为十进制的方法一样。
二.原码补码反码
在学习原码,反码和补码之前,需要先了解机器数和真值的概念。
1.机器数:一个数在计算机中的二进制表示形式,叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号,正数为0,负数为1.
比如,十进制中的数+3,计算机字长为8位,转换成二进制就是00000011.如果是-3,就是10000011.那么这里的00000011和10000011就是机器数。
2.真值:因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数10000011,其最高位1代表负,其真正数值是-3而不是形式值131(10000011转换十进制数等于131).所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。
例如:0000 0001的真值 =+000 0001=+1,1000 0001的真值 =-000 0001 = -1.
3.原码
原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值。比如如果是8位二进制:
【+1】原=0000 0001
【+1】原=1000 0001
第一位是符号位。因为第一位是符号位,所以8位二进制数的范围就是:
【1111 1111,0111 1111】
十进制就是
【-127,127】
原码是人脑最容易理解和计算的表示方式。
4.反码
正数的反码是本身
负数的反码就是在其1原码的基础上,符号位不变,其余各个位取反。
【+1】=【00000001】原=【00000001】反
【- 1】=【10000001】原=【11111110】反
可见如果一个反码表示的是负数,人脑无法直观的看出来它的数值。通常要将其转换成原码再计算。
5.补码
正数的补码就是是本身
负数的补码就是在其原码的基础上,符号位不变,其余各位取反,最后+1(即在反码的基础上+1)
【+1】=【00000001】原=【00000001】反=【00000001】补
【-1 】=【10000001】原=【11111110】反=【11111111】补
对于负数,补码的表示方式也是人脑无法直观看出其数值的。通常也需要转换成原码再计算其数值。