Integer.Max_Value上的Java Math.min()错误

时间:2013-09-18 03:36:47

标签: java

此代码应返回两个数字中较小的一个,返回一个类似于较大数字的负数:

Math.min(15, 21474836477) --> returns -2147483642

我怀疑这与int's的范围有关,所以我将值更改为long,程序运行正常。

我不太明白它返回的看似随机的数字 - 为什么它是-2147483643而不是我输入的实际数字-21474836477?它的溢出量是否会产生差异,或者它是否会以某种方式受到Math.min的其他参数的影响?

3 个答案:

答案 0 :(得分:2)

声明的结果-2147483642是5-Integer.MAX_VALUE,也是7 + Integer.MAX_VALUE。我怀疑Math.min参数实际上是该值,可能是由于对其中一个表达式的评估所致。非常消极,绝对不到15岁。

这个程序:

public class Test {
  public static void main(String[] args) {
    System.out.println(Math.min(15, Integer.MAX_VALUE));
    System.out.println(Math.min(15, 7+Integer.MAX_VALUE));
    System.out.println(Math.min(15, 5-Integer.MAX_VALUE));
  }
}

输出:

15
-2147483642
-2147483642

答案 1 :(得分:0)

这个

Math.min(15, 21474836477) 

无法返回

-2147483642

代码本身不会编译,因为整数文字21474836477int value range之外。

你可能会跑

Math.min(15L, 21474836477L) 

在这种情况下,您将运行重载的Math.min(long, long)方法。

答案 2 :(得分:0)

Math.min重载,如下所示。

静态双分(双a,双b)           返回两个double值中较小的一个。 static float min(float a,float b)           返回两个浮点值中较小的一个。 static int min(int a,int b)           返回两个int值中较小的一个。 静态长min(长a,长b)           返回两个long值中较小的一个。

因此您甚至可以将它用于长值,例如

          long x = 98759765l;
      long y = 15428764l;

      // print the smaller number between x and y
      System.out.println("Math.min(" + x + "," + y + ")=" + Math.min(x, y));

但是,你的长距离也超出了范围