整形的最大值+1的详细解释
以下内容仅代表个人理解,有不对的欢迎各位大佬指正~
代码展示:
public static void main(String[] args) {
int i=10;
while(i>0){
i = i +1;
if(i==10){
break;
}
}
System.out.println("i=" + i);
}
运行结果
代码解释
下面我来解释一下上述代码为什么求的是int型的最大值,首先定义的是一个int型的数,初始化值为10,其次while循环中判断条件是i > 0,也就是说只要大于零就会一直进行i+1,直到加到它的最大值,int型的最大值是2^31-1,加到它的最大值后再加1就会跳出循环,所以程序的输出结果是int的最大值加1。
个人理解
由于int型数据太大,接下来我会以byte的最大值+1来解释,道理都是一样,只是为了方便计算。
首先,我们要知道Java的数值是采用补码来表示的
- 原码:将最高位(也就是第一个)作为符号位(0表示正,1表示负),其它数字位代表数值本身的绝对值的数字表示方式。
- 反码:如果是正数,它的反码和原码一样;如果是负数,符号位不变,其余各位取反。
- 补码:如果是正数,它的反码和原码一样;如果是负数,就将该数字的反码加上1。
*即一个数是正数的话,它的原码,反码,补码都一样。0的反码、补码都为0。负数的话它的反码和补码另算。
byte的最大值是127
127 是一个正数,它的反码和补码都等于它的原码0111 1111,+1的话就等于1000 0000,最高位是1,也就是说得到了一个负数,并且得到的是补码,我们要把补码转换成十进制数,那么如何把一个负数的补码转换成它的十进制数呢?
1、首先先对补码各位取反(0变1,1变0);
2、将其转换为十进制数;
3、再将得到的十进制数加上负号
4、最后再减去1。
实际操作:
- 对补码取反:1000 0000---->0111 1111
- 将其转为十进制数:127
- 得到的十进制数加上负号-127
- 最后再-1:-128
int同理~