java中整数在电脑中的存储机制.

学习java,首先就是java的八大基本类型,我相信你都背的滚瓜烂熟了,但是你真的全部了解吗?
不急,我们先来做几个面试题.
1.电脑中,-1是怎么实际值是多少?
2.int的最大值是多少?最大值+1是多少?为什么?
3.int的最小值是多少?最小值-1等多少?为什么?

先给出答案
1.电脑中,-1是怎么实际值是32个1.
2.int的最大值是2的31次方-1,最大值+1=-2的32次方,也就是int的最小值
3.int的最小值是负的2的32次方,最小值-1=2的31次方-1,也就是int的最大值
如果知道怎么出上面题的答案,那么下面就不用看了.

以前我只是记住了答案,不知道为什么会得出这样的答案.今天在网上看见这几个问题,一时答不出来.感觉毁了三观一样,居然被这种入门的基础知识打败了,看来还是基础不牢靠,我在网上搜索了一些资料,在做了一下实验,发现这些其实都是学过的知识,只是需要稍加推导,真是汗颜啊!
首先,第一个问题后面问题的基础:
java基本类型在计算机上都是以补码形式存储的:
补码是什么?就是实际值的反码+1.至于为什么是这个公式可以参考

这又要补充几个概念原码,反码,补码.
源码就是人脑最容易记忆推导的形式:
原码:第一位为符号位1为负,0为正,为了简单,下面以byte举例
(byte)1原码:00000001
(byte)-1原码:10000001

反码:
正数的反码还是等于原码
负数的反码就是他的原码除符号位外,按位取反

所以:
(byte)1反码:00000001
(byte)-1反码:11111110

补码:电脑中所有数字都是以补码类型存储的,这就和第一道题联系了起来.
正数的补码等于他的原码
负数的补码等于反码+1。
所以补码公式:负数补码=~源码+1(符号位不变)
所以:
(byte)1反码:00000001
(byte)-1反码:11111111
第一道题问的是:电脑中,-1是怎么实际值是多少?
也就是问的是-1的补码,因为-1是int类型,所以是32位,一推算可以得出结果32个1.

第2,3题也是可以这样推算出来.为了简便,还是以byte类型为例:

byte最大值:0111 1111
(byte)1:0000 0001
0111 1111+000 0001=1000 0000
而得出的值是补码,
负数补码公式:补码=~源码+1(符号位不变)
可以推出:原码=~(补码-1)(符号位不变)
而套入公式原码=~(1000 0000-1)= ~(1000 0000+(-1))
再算出-1的补码:1111 1111
原码=~(1000 0000+1111 1111)= ~(0111 1111)=1000 0000
我们发现1000 0000转为原码还是10000000,它不是表示-0,而是最大位和符号位重叠,也就是-128.

第三题和第二题同理:
刚才算过,byte最小值原码补码都是1000 0000
(byte)-1补码:1111 1111
最小值-1=1000 0000+1111 1111=1 0111 1111
最高位超过八位舍弃所以结果为:0111 1111,这是个正数,所以原码和补码相等,所以byte的最小值-1=byte的最大值2的8次方-1

怎么样?现在想一想自己觉得完全懂了的知识,是不是真的完全懂了?