0

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

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

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

我不太明白它返回的看似随机的数字 - 为什么是它-2147483643而不是我输入的实际数字,-21474836477?差异是由溢出量引起的,还是受到 Math.min 的其他参数的某种影响?

4

3 回答 3

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
于 2013-09-18T04:07:47.980 回答
0

这个

Math.min(15, 21474836477) 

不可能回来

-2147483642

代码本身不会编译,因为整数文字21474836477超出了int 值范围

你可能跑了

Math.min(15L, 21474836477L) 

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

于 2013-09-18T03:44:46.533 回答
0

Math.min 被重载,如下所示。

static double min(double a, double b) 返回两个 double 值中较小的一个。static float min(float a, float b) 返回两个浮点值中较小的一个。static int min(int a, int b) 返回两个 int 值中较小的一个。static long min(long a, long 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));

但是,您的远距离也超出范围

于 2013-09-18T03:49:27.150 回答