Math.abs(-2147483648)的返回值为什么是-2147483648?在任何语言中,Math.abs(-2147483648)的返回值都是-2147483648吗?

解决方案 »

  1.   

              这个是因为在java里面int类型的取值范围是-2^31~(2^31 - 1),算出来就是-2147483648~2147483647,这是一个圆圈,我理解为一根-2147483648~2147483647取值范围的数轴,起点和终点相连,围成一个圈.当超过2147483647的时候,数据取值溢出,不能表示比2147483647大的正整数,此时继续在数轴上往后数数,下一个数就是-2147483648,2147483649比2147483647多2,往后数两个数,第二个就是-2147483647.可以按照这个规律去推算后面超过2147483647的取值.如果要细讲原理,就需要看原码,反码,补码的概念了,你可以自己搜一搜.在这里我就不赘述了.         当计算Math.abs(-2147483648)时,计算正常的话,结果应该是2147483648,按照上面说的,2147483648超过2147483647了,往下数一个数,就是-2147483648.你也可以去验证计算Math.abs(2147483647+2)值是2147483647,Math.abs(2147483647+3)的值是2147483646
             你也可以看看另外一位同学碰到的类似问题http://bbs.csdn.net/topics/392146515
      

  2.   

    1楼讲的没错。这里我从二进制角度分析一下:
    我们知道:
    1=0000...001
    2147483647=0111...111
    -2147483648=1000...000因此我们有:
    2147483647+1 =0111...111+000...001=100...000=-2147483648考虑
    x=-2147483648
    -x由下面定义:
    x+(-x)=0
    1000...000+1000...000=0
    所以有 -x=1000...000因为x<0,我们有
    abs(x)=-x=x
      

  3.   

    这样好了
    Math.abs((long) Integer.MIN_VALUE)
    方法定义,返回2147483648超过int表达范围了
    public static int abs(int a)
      

  4.   

    Math.abs(-2147483648L)
    加个L表示long类型就可以了