问题1:
为什么0减去整数最小值是个负数,减去整数最小值/2是个正数?
解答:
Integer.MIN_VALUE: -2147483648
Integer.MAX_VALUE: 2147483647
0减去最小值就变成了214783648,超过了整数的最大值2147483647,所以就溢出了。溢出就相当于一个圆,超过最大值就要变成最小值了。
0减去整数最小值/2是个正数,是因为值没有超过最大值,没有溢出。
问题2:
减号放在外面是个正值,为什么放里面就是负值?
减号放在里面改变了运算顺序,本来应该是先计算除法的,但是由于计算机补码的特性(我不懂,但是知道其存在性),先对Interger.MIN_VALUE进行了负值的计算,又由于无声整数溢出:
Integer.MIN_VALUE is -2^31和
Integer.MAX_VALUE is 2^31-1,
因此-IntergerMIN_VALUE等于 2^31, 即Integer.MAX_VALUE + 1,根据定义,它对于整数而言太大。因此它溢出并变成Integer.MIN_VALUE
然后进行了除2的运算,所以最终结果为-1073741824。
以上两种溢出的解释不通,但是意思是一样的,都很好理解。