public class SDO
{
public static void main(String args[])
{
SDO sdo = new SDO();
System.out.println(sdo.amountOfData(1));
System.out.println(sdo.amountOfData(86400));
}
public long amountOfData(int seconds)
{
long result = (4096*4096*seconds);
return result;
}
}
此代码在我的测试中返回,错误:预期的amountData(1000):< 16777216000>但是:< -402653184>。难道不能输入 long 存储更高的整数吗?或者如果不是如何使这个代码工作?
答案 0 :(得分:10)
更改
long result = (4096*4096*seconds);
到
long result = (4096L*4096L*seconds);
以获得long
结果并避免int
溢出。
4096*4096*seconds
是3个int
的乘法,并产生int
,在分配给long
变量之前可能会溢出。
答案 1 :(得分:6)
使用:
long result = (4096*4096*seconds);
result
确实可以保留该值,但计算仅使用int
类型进行,因为它仅对int
执行算术运算}第
因此表达式的结果将是int
,之后你会将其放入long
但而不是在你丢失信息之前。
只需将第一个常量设为long
,就可以强制Java将long
用于中间结果:
long result = 4096L * 4096 * seconds;
但是,为了让你的意图更加清晰,让它们变得更加宽松可能更为谨慎。
Java语言规范:
中对此进行了介绍数字提升应用于算术运算符的操作数。数字推广上下文允许使用身份转换,扩展原始转换或取消装箱转换。
数字促销用于将数字运算符的操作数转换为公共类型,以便可以执行操作。两种数字促销是一元数字促销和二进制数字促销。
一个其他解决方案是让函数调用自己扩展数据类型,例如:
public long amountOfData (long seconds) {
return seconds * 4096 * 4096;
}
这将产生类似的效果,因为seconds
现在将是long
,因此计算将以long
完成。它还会缩短你的代码。