为何Math.abs(Integer.MIN_VALUE) = Integer.MIN_VALUE

如题,

为何Math.abs(Integer.MIN_VALUE) = Integer.MIN_VALUE ?

查看Math.abs方法,代码如下

publicstaticintabs(inta) {

        return (a < 0) ? -a : a;

}

也就是说Integer.MIN_VALUE  = (0-Integer.MIN_VALUE )


原因如下:

负数的2进制计算,采用补码的方式进行。

0-Integer.MIN_VALUE   = 0+(-Integer.MIN_VALUE)

Integer.MIN_VALUE = 0x10000000,00000000,00000000,00000000

那么它的补码是

换算流程

1.先换算成反码

01111111,11111111,11111111,11111111

2.加1

10000000,00000000,00000000,00000000


也就是说Integer.MIN_VALUE的补码=它自己

所以0+(-Integer.MIN_VALUE)=Integer.MIN_VALUE

//----------------------------------------------------------------------

更简单的理解方法

Integer.MIN_VALUE=-2147483648

对其取绝对值=2147483648,换算成2进制是10000000,00000000,00000000,00000000,刚好在是Integer.MAX_VALUE+1,进位把最高位的符号位从0变成了1



版权声明:本文为broust原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。