在Java中Math.abs(-2147483648)会返回什么结果?
测试
public class MathAbsOverflowTest {
public static void main(String[] args) {
System.out.println(Math.abs(-2147483648));
}
}
编译运行以上这段代码,运行结果如下:
原因
- 在java中整型的表示范围为-231 - 231-1,即-2147483648~2147483647,因为在计算机中数字一般是按照补码的形式存储,
1000 0000 0000 0000 0000 0000 0000 0000
表示-2147483648 - 而取绝对值的底层逻辑是取反操作,取反操作的底层逻辑是对位取反后+1,即N取反可以表示为
~N+1
。 - -2147483648在计算机中表示为
1000 0000 0000 0000 0000 0000 0000 0000
,这个值取反为0111 1111 1111 1111 1111 1111 1111 1111
,再+1得最后结果为1000 0000 0000 0000 0000 0000 0000 0000
,这个值表示的还是-2147483648。 - 要想获取正确的结果可以将-2147483648转成long类型,即-2147483648L