System.out.println(Math.abs(Integer.MIN_VALUE));回报
-2147483648
这难道不应该返回绝对值 2147483648
? -------------------------------------------------------------------------------------------------------------------------
1.Integer.MIN_VALUE
是 -2147483648
的,但一个32位整数可以包含最高值是 +2147483647
。试图代表 +2147483648
在32位int将有效地“翻转”到 -2147483648
。这是有符号整数,两个的二进制表示 +2147483648
和 -2147483648
是相同的。这一点,也没有问题,但如 +2147483648
被认为是超出范围。 对于在这个问题上多一点读书,你可能要检查出两个的维基百科的文章 2. 下面是Java的医生说的Math.abs() 3. 你指出的行为确实,反直觉的。但是,此行为是由javadoc文档中指定的 Math.abs(int)
:如果不是负数,则返回。 如果是负的,否定的,则返回。即, Math.abs(int)
应该像下面的Java代码: public static int abs(int x){ if (x >= 0) { return x; } return -x;}也就是说,在否定的情况下,
-x
。 按照JLS的第15.15.4中, -x
等于 (~x)+1
,其中 ~
是位运算符。 要检查这是否听起来很正确,让我们-1为例。 整数值 -1
是可记为 0xFFFFFFFF
在十六进制中的Java(看看这个用 println
或任何拍摄 -(-1)
给出: -(-1) = (~(0xFFFFFFFF)) + 1 = 0x00000000 + 1 = 0x00000001 = 1因此,它的工作原理。 现在尝试用
Integer.MIN_VALUE
。知道的最低整数可以表示为 0x80000000
,即,优先位设置为1,并设置为0的31个剩余比特,我们有: -(Integer.MIN_VALUE) = (~(0x80000000)) + 1 = 0x7FFFFFFF + 1 = 0x80000000 = Integer.MIN_VALUE这就是为什么
Math.abs(Integer.MIN_VALUE)
回报 Integer.MIN_VALUE
。还要注意的是 0x7FFFFFFF
是 Integer.MAX_VALUE
。 这就是说,我们如何才能避免出现问题,由于在未来的这个反直觉的返回值?我们可以,正如,铸就我们 int
s到 long
之前。然而,我们必须要么赶逐回 int
s,这不工作 Integer.MIN_VALUE == (int) Math.abs((long)Integer.MIN_VALUE)
。 或继续 long
•本希望我们永远不会调用 Math.abs(long)
用一个值等于 Long.MIN_VALUE
,因为我们也有 Math.abs(Long.MIN_VALUE) == Long.MIN_VALUE
。我们 BigInteger
到处都是, BigInteger.abs()
确实总是返回一个正值。这是一个很好的选择,硬朗的操控比原始整数类型有点慢。 我们可以写我们自己的包装器 Math.abs(int)
,像这样: /** * Fail-fast wrapper for {@link Math#abs(int)} * @param x * @return the absolute value of x * @throws ArithmeticException when a negative value would have been returned by {@link Math#abs(int)} */public static int abs(int x) throws ArithmeticException { if (x == Integer.MIN_VALUE) { // fail instead of returning Integer.MAX_VALUE // to prevent the occurrence of incorrect results in later computations throw new ArithmeticException("Math.abs(Integer.MIN_VALUE)"); } return Math.abs(x);}作为最后一点,这个问题似乎是众所周知的见,例如有关相应的FindBugs规则此项。 4. 一看就知道你期待的结果,投
Integer.MIN_VALUE
至 long
: System.out.println(Math.abs((long) Integer.MIN_VALUE));5. 2147483648不能存储在java中一个整数,其二进制表示是为-2147483648。 6. 但
(int) 2147483648L == -2147483648
有一个负数而没有正相当于所以没有积极的价值吧。你会看到则为Long.MAX_VALUE的行为。 本文标题 :Math.abs为Integer.Min_VALUE返回错误的值