Integer.MIN_VALUE-1 = Integer.MAX_VALUE
Integer.MAX_VALUE+1 = Integer.MIN_VALUE
- Integer.MAX_VALUE的补码为
01111111 11111111 11111111 11111111
- Integer.MIN_VALUE的补码为
10000000 00000000 00000000 00000000
原码反码补码
原码的表示与机器数真值表示的一样,即用第一位表示符号,其余位表示数值,例如的十进制的的正负1,用8位二进制的原码表示如下:
【+1】= 原:[ 0000 0001 ]
【-1】= 原:[ 1000 0001 ]
反码的表示方法为:
- 正数的反码是其原码本身。
- 负数的反码是在其原码的基础上,符号位不变,其余各位取反。
【+1】= 原: [ 0000 0001 ] = 反:[ 0000 0001 ]
【-1】 = 原:[ 1000 0001 ] = 反:[ 1111 1110 ]
补码的表示方法为:
- 正数的补码是其原码本身。
- 负数的补码是在其原码的基础上,符号位不变,其余各位取反后加1(
即在反码的基础上加1
)。
【+1】= 原: [ 0000 0001 ] = 反:[ 0000 0001 ] = 补:[ 0000 0001 ]
【-1】 = 原:[ 1000 0001 ] = 反:[ 1111 1110 ] = 补:[ 1111 1111 ]
数据在计算机中的存储形式
计算机实际只存储补码, 所以原码转换为补码的过程,也可以理解为数据存储到计算机内存中
的过程:
一、Integer.MAX_VALUE+1 = Integer.MIN_VALUE
理解了原码反码补码,这个就好理解了
Integer.MAX_VALUE + 1= Integer.MIN_VALUE
01111111111111111111111111111111
+00000000000000000000000000000001
=10000000000000000000000000000000
正好是Integer.MIN_VALUE
二、Integer.MIN_VALUE-1 = Integer.MAX_VALUE
减去1就等于加上-1
Integer.MIN_VALUE-1 = Integer.MAX_VALUE
01111111111111111111111111111111
-1:11111111111111111111111111111111
= 10000000000000000000000000000000
也就是Integer.MAX_VALUE
三、Numeric overflow in expression
由于计算机是使用上面的计算方式,所以超出范围IDEA编译器会提醒我们,可能负数会变为正数,知道就不用怕了
参考:深入理解计算机中的原码、补码、反码
[底层] 为什么Integer.MIN_VALUE-1会等于Integer.MAX_VALUE