【问题标题】:Arithmetic expression not resolving in function call算术表达式未在函数调用中解析
【发布时间】:2015-11-17 15:51:17
【问题描述】:

我有一个函数需要一个长值作为参数之一。

void doSomething(long limit, ...) {
//statements
}

在函数调用中,我将参数传递为,

doSomething(5 * 1024 * 1024 * 1024, ...);

函数从不接收表达式的最终值5368709120,而是接收1073741824。我无法理解为什么会这样。

【问题讨论】:

  • 5L * 1024 * 1024 * 1024(注意5后的L)改成long
  • 另外,你应该避免幻数;而是使用 long 常量,例如private static final long SIZE = 5L * 1024 * 1024 * 1024;.

标签: java long-integer arithmetic-expressions function-call


【解决方案1】:

查看号码5368709120。整数范围为-2,147,483,648 to 2,147,483,647

那里发生整数溢出。参数 (5 * 1024 * 1024 * 1024) 中的结果值超过了 int 最大值的限制。将任何值转换为 long,以便将结果存储到 long

doSomething(5L * 1024 * 1024 * 1024, ...); // look the literal L after 5 

【讨论】:

  • 5 * 1024 * 1024 * 1024L 这样的表达式是危险的,因为* 是左关联的:你很可能在5 * 1024 * 1024 ... * 中有一个整数溢出 到达1024L之前。比较安全的方法是用L后缀标记5下面的表达式很长
【解决方案2】:

因为您的调用发送了一个int,然后在作为int 执行操作后将其装箱为long

int 执行的操作将溢出Integer.MAX_VALUE (2147483647) 并返回不需要的结果。

您可以将您的操作转换为long,如下所示:

doSomething((long)5 * 1024 * 1024 * 1024, ...);

您还可以测试打印出这些值:

System.out.println(5 * 1024 * 1024 * 1024); // overflowing
System.out.println((long)5 * 1024 * 1024 * 1024); // casted, not overflowing Long.MAX_VALUE

输出

1073741824
5368709120

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 2022-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多