[底层] 为什么Integer.MIN_VALUE-1会等于Integer.MAX_VALUE
Integer.MIN_VALUE-1 = Integer.MAX_VALUE
Integer.MAX_VALUE+1 = Integer.MIN_VALUE
实际上这里是计算机底层的位运算法则问题[1]
计算机底层采用了补码来进行加减乘除的运算,好处是符号位参与运算.
举上面两个例子来说明问题。
Integer.MIN_VALUE: $10000000000000000000000000000000$
Integer.MAX_VALUE: $01111111111111111111111111111111$
-1: $11111111111111111111111111111111$
一、
Integer.MIN_VALUE - 1 = Integer.MIN_VALUE + (-1)
$10000000000000000000000000000000$
+ $11111111111111111111111111111111$
---------------------------------------------------
$1,01111111111111111111111111111111$
舍弃最高位的进位,所以得到的就是Integer.MAX_VALUE
二、
Integer.MAX_VALUE + 1= Integer.MIN_VALUE
$01111111111111111111111111111111$
+ $00000000000000000000000000000001$
---------------------------------------------------
$10000000000000000000000000000000$
除了补码之外,还有反码、移码等等。
1、反码
整数是它本身,负数是符号位不变数值位求反
2、移码
主要用于浮点数的表示当中的阶码
相应的补码符号位求反就是移码