天天看点

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont

Math.abs为Integer.Min_VALUE返回错误的值 这段代码:

回报<code>-2147483648</code>这难道不应该返回绝对值<code>2147483648</code>?

-------------------------------------------------------------------------------------------------------------------------

1. <code>Integer.MIN_VALUE</code>是<code>-2147483648</code>的,但一个32位整数可以包含最高值是<code>+2147483647</code>。试图代表<code>+2147483648</code>在32位int将有效地“翻转”到<code>-2147483648</code>。这是有符号整数,两个的二进制表示<code>+2147483648</code>和<code>-2147483648</code>是相同的。这一点,也没有问题,但如<code>+2147483648</code>被认为是超出范围。

对于在这个问题上多一点读书,你可能要检查出两个的维基百科的文章

2. 下面是Java的医生说的Math.abs()

3. 你指出的行为确实,反直觉的。但是,此行为是由javadoc文档中指定的<code>Math.abs(int)</code>:如果不是负数,则返回。 如果是负的,否定的,则返回。即,<code>Math.abs(int)</code>应该像下面的Java代码:

也就是说,在否定的情况下,<code>-x</code>。 按照JLS的第15.15.4中,<code>-x</code>等于<code>(~x)+1</code>,其中<code>~</code>是位运算符。 要检查这是否听起来很正确,让我们-1为例。 整数值<code>-1</code>是可记为<code>0xFFFFFFFF</code>在十六进制中的Java(看看这个用<code>println</code>或任何拍摄<code>-(-1)</code>给出:

因此,它的工作原理。 现在尝试用<code>Integer.MIN_VALUE</code>。知道的最低整数可以表示为<code>0x80000000</code>,即,优先位设置为1,并设置为0的31个剩余比特,我们有:

这就是为什么<code>Math.abs(Integer.MIN_VALUE)</code>回报<code>Integer.MIN_VALUE</code>。还要注意的是<code>0x7FFFFFFF</code>是<code>Integer.MAX_VALUE</code>。 这就是说,我们如何才能避免出现问题,由于在未来的这个反直觉的返回值?我们可以,正如,铸就我们<code>int</code>s到<code>long</code>之前。然而,我们必须要么赶逐回<code>int</code>s,这不工作<code>Integer.MIN_VALUE == (int) Math.abs((long)Integer.MIN_VALUE)</code>。 或继续<code>long</code>•本希望我们永远不会调用<code>Math.abs(long)</code>用一个值等于<code>Long.MIN_VALUE</code>,因为我们也有<code>Math.abs(Long.MIN_VALUE) == Long.MIN_VALUE</code>。我们<code>BigInteger</code>到处都是,<code>BigInteger.abs()</code>确实总是返回一个正值。这是一个很好的选择,硬朗的操控比原始整数类型有点慢。

我们可以写我们自己的包装器<code>Math.abs(int)</code>,像这样:

作为最后一点,这个问题似乎是众所周知的见,例如有关相应的FindBugs规则此项。

4. 一看就知道你期待的结果,投<code>Integer.MIN_VALUE</code>至<code>long</code>:

5. 2147483648不能存储在java中一个整数,其二进制表示是为-2147483648。

6. 但<code>(int) 2147483648L == -2147483648</code>有一个负数而没有正相当于所以没有积极的价值吧。你会看到则为Long.MAX_VALUE的行为。

本文标题 :Math.abs为Integer.Min_VALUE返回错误的值