首先得知道,在java中,int类型占4个字节,1个字节等于8位二进制,所以int类型32位,范围是-2147483648到2147483647,
因为1000 0000, 0000 0000, 0000 0000, 0000 0000这个是-2^31=-2147483648,所以负数多一个。
然后,因为计算机CPU的运算器中只有加法器,所以减法要转化成加法来计算,所以引入了补码。
补码可以解决两同号数相减或两异号数相加的问题。
举个例子,A表示十进制数“+6”,B表示十进制数“-8”,如果把这两个数的原码直接相加,那么
0000 0110
+ 1000 1000
————————
1000 1110
结果为-14,很明显是错的。
如果把这两个数的补码相加,那么
0000 0110 “+6”补码
+ 1111 1000 “-8”补码
————————
1111 1110 “-2”补码
结果是-2的补码,结果是正确的。
要理解上面的补码运算,得先知道一下3点:
1、正数的原码 反码 补码完全相同。
2、负数的反码是将原码按位取反,补码=反码+1。
3、补码转原码和原码转补码的方法是一样的。
最后根据上面的计算方法,计算INT_MIN - 1的结果,看是不是等于 INT_MAX。
1000 0000, 0000 0000, 0000 0000, 0000 0000 “-2147483648”补码
+ 1111 1111,1111 1111, 1111 1111,1111 1111 “-1”补码
————————————————————————
1 0111 1111,1111 1111, 1111 1111,1111 1111
很明显,运算溢出了。舍去溢出的最高位,最后运算的结果是0111 1111,1111 1111, 1111 1111,1111 1111。
又因为正数的原码 反码 补码完全相同。所以0111 1111,1111 1111, 1111 1111,1111 1111就是“2147483647”补码、源码= INT_MAX。
所以,综上所述:INT_MIN - 1的结果等于 INT_MAX。