双整数值溢出

时间:2018-06-11 07:13:48

标签: java

我试图理解下面代码的行为,我写这个代码来试验计算溢出。

public static void main(String[] args) {

    System.out.println(getSomeValue());
    System.out.println(getFixedSomeValue());
}

private static double getSomeValue() {
    return (2500000 - 0) * 250000 * (200 + 310);
}

private static double getFixedSomeValue() {
    return (double) (2500000 - 0) * 250000 * (200 + 310);
}

输出:

-9.9787264E8
3.1875E14

我所理解的是: 可能是因为Integer溢出为:

Double.MAX_VALUE = 1.7976931348623157E308
Integer.MAX_VALUE = 2147483647

我不明白为什么值不同? 当返回类型的方法是double时,不应该自动将它转换为double?

3 个答案:

答案 0 :(得分:8)

(2500000 - 0) * 250000 * (200 + 310)是由int文字和数字运算符组成的表达式,因此使用整数运算符进行计算,结果为int,因此溢出(因为它仅限于Integer.MAX_VALUE)。在方法返回之前,溢出的结果将转换为double,但为时已晚。

当您在开头添加(double)时,将(2500000 - 0)强制转换为double并避免数字溢出,因为现在所有运算符都是浮点运算符,导致{{1}价值。这类似于写作

double

答案 1 :(得分:0)

是和否。在返回时,它将其转换为double,但计算以整数格式完成,在达到最大值时,它再次从min值开始。因此,如果您执行INT_MAX + 1,您将获得INT_MIN,这就是为什么您得到负面结果的原因。

答案 2 :(得分:0)

  

当方法的返回类型为double时,是否应该自动将其转换为double?

确实如此,也许不是你的意思。

private static double getSomeValue() {
    return (2500000 - 0) * 250000 * (200 + 310);
}

与:

相同
private static double getSomeValue() {
    int e = (2500000 - 0) * 250000 * (200 + 310);
    return (double) e;
}

即。表达式使用int进行评估,然后在最后投射到double