Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/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_Long Integer_Arithmetic Expressions_Function Call - Fatal编程技术网

Java 函数调用中未解析算术表达式

Java 函数调用中未解析算术表达式,java,long-integer,arithmetic-expressions,function-call,Java,Long Integer,Arithmetic Expressions,Function Call,我有一个函数,它期望一个长值作为参数之一 void doSomething(long limit, ...) { //statements } 在函数调用中,我将参数传递为 doSomething(5 * 1024 * 1024 * 1024, ...); 函数从不接收表达式的最终值5368709120,而是接收1073741824。我不明白为什么会发生这种情况。看看号码5368709120。整数的范围是-2147483648到2147483647 整数溢出正在那里发生。参数中的结果值(5*

我有一个函数,它期望一个长值作为参数之一

void doSomething(long limit, ...) {
//statements
}
在函数调用中,我将参数传递为

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

函数从不接收表达式的最终值
5368709120
,而是接收
1073741824
。我不明白为什么会发生这种情况。

看看号码
5368709120
。整数的范围是
-2147483648到2147483647

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

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

因为您的调用发送了一个
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

将其
5L*1024*1024*1024
(注意5后面的L)设置为
long
,同时,您应该避免使用幻数;改为使用
long
常量,例如
private static final long SIZE=5L*1024*1024*1024
。像
5*1024*1024*1024L
这样的表达式是危险的,因为
*
是左关联的:在
5*1024*1024中很可能有整数溢出*到达
1024L
之前。更安全的方法是用
L
后缀标记
5
:下面的表达式很长