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
:下面的表达式很长