原因为:java的整形溢出。
在java中,整形的范围为
-232 ~ 232-1
因为0的存在,所以最大值需要减去1
观察Math.abs源码:
public static int abs(int a) {
return (a < 0) ? -a : a;
}
可以发现:根据a与0的关系,返回其本身或者其负数形式。而-2147483648本身是小于0的,因此需要返回-(-2147483648)也就是2147483648,也就是232。但是,整形的最大值只有232-1。在计算机的二进制模系统也就是补码中最大值再加一会变成最小值,如同时钟的模为12,最大值12再加一变成了1,是一个首尾相接的循环。
因此Math.abs(-2147483648) 的返回值为-2147483648。