在Java中,整型(int类型)的最大值是2147483647,而最小值是-2147483648。
那么我们现在对int类型最大值+1,会发生什么结果?
代码如下:
打印结果:
可以看到输出结果不是2147483648;而是-2147483648(int类型的最小值)。
这是为什么呢?
首先,大家都知道:任何一个数字,存储到计算机当中,都是以二进制的形式进行存储的,而Java的数值是采用补码来表示的。
原码:原码是最直接的一种表示法,最高位表示符号位,0表示正数,1表示负数。
反码:正数的反码与其原码相同。负数的反码是其原码除符号位外,所有位取反。
补码:正数的补码与其原码相同。负数的补码是其反码加1。
当一个int类型的变量值达到了最大值并尝试加1时,会发生溢出,因为整数不能存储在负的二进制补码中所需的额外位中。在这种情况下,Java的整数溢出是允许的,结果会变成整型的最小值-2147483648。
我们接下来用byte类型举个例子:
byte类型的最大值为127,最小值为-128
127的原码和补码都为:0 1 1 1 1 1 1 1 ,补码+1就等于 1 0 0 0 0 0 0 0 ,最高位为符号位,因为是1,就代表是负数,那么我们按照补码表示负数的规则,以逆运算的方式求出它的绝对值,就知道这个负数的值了。
运算如下:
1、补码取反:1 0 0 0 0 0 0 0 →0 1 1 1 1 1 1 1 ;
2、转换成十进制:127;
3、十进制加负号:-127;
4、再-1:-128;
因此 byte类型的最大值+1之后输出的也是最小值,这也就是为什么java中整数类型的表示范围不是对称的原因。