zoukankan      html  css  js  c++  java
  • Math.abs为Integer.Min_VALUE返回错误的值

     
    Math.abs为Integer.Min_VALUE返回错误的值 这段代码:
    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。还要注意的是0x7FFFFFFFInteger.MAX_VALUE。 这就是说,我们如何才能避免出现问题,由于在未来的这个反直觉的返回值?我们可以,正如,铸就我们ints到long之前。然而,我们必须要么赶逐回ints,这不工作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_VALUElong
    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返回错误的值
  • 相关阅读:
    移动端 (基于jquery的3个)touch插件
    leaflet开源地图库源码 浏览器&移动设备判断(browser.js)备份
    移动端 常见问题整理 iOS下的 Fixed + Input 调用键盘的时候fixed无效问题解决方案
    百度echarts扇形图每个区块增加点击事件
    js 性能优化整理之 缓存变量
    移动端 延迟加载echo.js的使用
    js 性能优化整理之 高频优化
    css整理 background-size优化
    原生js 样式的操作整理
    百度地图展示分公司信息 (针对电视机)
  • 原文地址:https://www.cnblogs.com/dailidong/p/7571201.html
Copyright © 2011-2022 走看看