⼆进制正负数加减法计算INT_MIN-1=INT_MAX
⾸先得知道,在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。