Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 双整数值溢出_Java - Fatal编程技术网

Java 双整数值溢出

Java 双整数值溢出,java,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); } pr

我正在试图理解下面我为实验计算溢出而编写的代码的行为

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
我的理解是: 这可能是因为整数溢出,如下所示:

Double.MAX_VALUE = 1.7976931348623157E308
Integer.MAX_VALUE = 2147483647
我不明白为什么这些值不同? 当方法的返回类型为double时,它是否应该自动将其强制转换为double?

(2500000-0)*250000*(200+310)
是一个由
int
文本运算符和数字运算符组成的表达式,因此使用整数运算符对其求值,结果是
int
,因此溢出(因为它被限制为
Integer.MAX_VALUE
)。在方法返回之前,溢出结果被转换为
double
,但是太晚了

在开始添加
(double)
时,将
(2500000-0)
强制转换为
double
,并避免数字溢出,因为现在所有运算符都是浮点运算符,导致
double
值。这与写入类似

return (2500000.0 - 0) * 250000 * (200 + 310)
               ^ decimal point = double literal rather than int

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

当方法的返回类型是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;
}

i、 e.使用
int
对表达式求值,然后在最后转换为
double

在第一种情况下,您只进行整数运算。
getSomeValue
仅使用
int
,因此这将是给出整数结果的整数运算。我试图给出这些运算如何工作的完整答案d、 。谢谢Eran!还有一个疑问,我在getFixedSomeValue()中执行双精度强制转换安全吗?或者有更好的方法吗?@不可能你说的“安全”是什么意思?如果你想问代码是否安全以避免数字溢出,那么只要表达式是双精度的(2500000-0)-不会溢出。我更喜欢使用双文本,例如2500000.0,而不是强制转换。我很抱歉跳过详细信息。没有文本,只有“int”变量。但我期望的结果是双文本。我只想知道,哪个是安全的:
(double)((intA-intB)*(intC*intD*intE)*(intX+intY));(double)((double)(intA-intB)*(double)(intC*intD*intE)*(double)(intX+intY));
@最安全的方法是将所有int变量更改为double。如果不可能,请将每个表达式中的第一个操作数强制转换为double。例如,如果
intC*intD*intE
可能导致int溢出,请将其更改为
(double)intC*intD*intE
。或者,对于完整的表达式-
((双)intA-intB)*((双)intC*intD*intE)*((双)intX+intY)
我得到了我的答案Eran!谢谢!谢谢Andy,我得到了那个问题的答案。这是另一个。这两个都一样吗
2.
(double)((double)(intA-intB)*(double)(intC*intD*intE)*(double)(intX+intY));
整数上不能有1溢出吗?“这是另一个”如果你有一个单独的问题,请问一个单独的问题。对不起,我的不好。我不应该那样写。实际上这两个问题都是相关的。在我阅读了你的答案并获得了更多的理解后,我得到了第二个问题。