import java.util.*;
public class Test {
public static void main(String[] args) {
System.out.println(Math.abs(Integer.MIN_VALUE));
}
}
------解决方案--------------------
我查了一下。int的范围是-2147483648~2147483647
Integer.MIN_VALUE是-2147483648,而他的绝对值是2147483648,已经超出了int的范围,造成了溢出。
转换为二进制进位影响到符号位,所以会成为负的。
具体怎么样忘了,反正大体就是这个意思。。。。上学的时候学的。
------解决方案--------------------
因为最小的负整数是 -2147483648而最大的正整数是 +2147483647,所以就原样输出了。 下面是JDK 1.3 API所述
abs
public static int abs(int a)
Returns the absolute value of an int value. If the argument is not negative, the argument is returned. If the argument is negative, the negation of the argument is returned.
Note that if the argument is equal to the value of Integer.MIN_VALUE, the most negative representable int value, the result is that same value, which is negative.
Parameters:
a - an int value.
Returns:
the absolute value of the argument.
See Also:
Integer.MIN_VALUE
------解决方案--------------------
首先
我们打印
System.out.println(Integer.MIN_VALUE);
输出是-2147483648
我们再打印
System.out.println(Integer.MAX_VALUE );
输出是2147483647
现在我们要 求第一次的打印数的绝对值,从数学角度来讲,肯定是2147483648
然而我们第二次打印的数,就已经告诉了我们,Integer最大才2147483647啊?
需要 (nteger.MAX_VALUE + 1)才行
查看源码Integer.MAX_VALUE 为MAX_VALUE = 0x7fffffff;所以加1后为0x80000000,又0x80000000为整型字面常量,满了32位,且最位为1,所以字面上等于 -0,但又由于 -0就是等于0,所以-0这个编码就规定为最小的负数,32位的最小负数就是-2147483648。
这些问题没什么好纠结的,记住一句话就行了:
最大整数加1后会等于最小整数: