01十进制
十进制(逢10进1)是我们最常用的一种数位进制方式。十进制和二进制可以相互转换,如下所示:
10进制转2进制
上图中,10称做基数,10^n(10的n次幂)被称作权,… 10000、1000、100、10、1。
02二进制
二进制(逢2进1),是基数为"2"的进制。计算机使用二进制,是因为计算机设计者发现在复杂电路中,将低电平表示0,高电平表示1,只有两种电位在通过门电路之后更容易计算。其实用其它进制也可以表示,但是比较麻烦。
二进制的基数为2,权为2^n(2的n次方),……、128、64、32、16、8、4、2 1。
2进制转16进制
03补码基础
关于补码,有比较有趣的演化过程,假如计算机中使用4位的二进制表示数据,如图3-1中的a,最多能表示0到15(10进制),后有计算机大佬在此基础上做了一个细微改动,将所有二进制以1开头的数(大于7的数)放到0之前:如图3-1的b,并且规用用这部分8-15对应二进制表示负数-1到-8,这就是4位补码:如图3-1的c。
补码演化
仔细观察会发现,-1(1111)+1(0001) = 1 0000,舍弃最高位"1"(超出4位),保留最后4位(4个0),则-1(1111)+1(0001) = 0(1 0000)
计算-1+1
同理-8(1000)+7(0111)=-1(1111)。
至此,得出了结论:在封闭的四位运算中(超出4位就丢弃),这种设计和规定是非常合理的。可是,我们又有了疑问:(-1)*(1)=?,会不会和结果就不一样了?我来算一下:
计算-1*1
结果一样,(-1)*(-1)= 1即1111 * 1111 = 0001,这种数据运算规则就是补码运算。
总结:
计算机中正数和负数的关系是取反加一。举例如:~3+1=-3(~3表示对3取反)补码运算是封闭的:运算结果保留在补码范围内,超范围就溢出.补码边界运算有溢出风险.4位二进制补码最多能表示2^4(16)个数,数的范围是-8~78位二进制补码最多能表示2^8(256)个数,数的范围是-128~12716位二进制补码最多能表示2^16(65536)个数,数的范围是-32768~3276732位二进制补码最多能表示2^32个数,数的范围是-2G~2G-1(1G= 1024*1024*1024)当我们知道了计算机中的一个二进制数,比如0000 1111,它的10进制为:
0000 1111 = 2^3+2^2+2^1+2^0 = 15(十进制) // 因为是正数,直接转换既可
那1111 1001,表示的十进制数是多少?
则计算机中存储的1111 1001转换为十进制数是-7。反过来的换算过程如下:
计算机中二进制(转)十进制:
以0开头的,直接将2进制转换为10进制;以1开头的,需要4步,按位取反->末尾位加1->转换为十进制->添加负号。十进制数(转)计算机中二进制数:
正数取原码,负数按位取反末尾加1。需要注意的是:4位补码不能表示8。
04Java中的二进制规则
Java内部只有二进制补码,计算机内部数据以二进制补码表示。Java内部采用补码运算,自动发送上溢出(乘法为上溢出)和下溢出(除法为下溢出)。Java内部没有10进制,但是Java尽量按照人类习惯输入输出。补码的负数,最高位是1,也称作符号位。
05十六进制
十六进制是二进制制的简写,方便专业人员书写二进制数据。比如一个十进制数1234567890,用十六进制表示就比二进制表示更方便,如下所示:
十六进制的基数为16,权为16^n(16的n次方),...、4096、256、16、1。
十六进制与十进制对照表:
十六进制和其他进制间的转换:
41(16进制) = 4*(16^1) + 1*(16^0) = 65(10进制) = 0100 0001(2进制)
10进制、2进制、8进制、16进制对照表
举报/反馈