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;
}
}
Run Code Online (Sandbox Code Playgroud)
此代码在我的测试中返回,错误:预期的amountData(1000):<16777216000>但是:< - 402653184>.不应该键入长存甚至更高的整数?或者如果不是如何使这个代码工作?
Era*_*ran 10
更改
long result = (4096*4096*seconds);
Run Code Online (Sandbox Code Playgroud)
至
long result = (4096L*4096L*seconds);
Run Code Online (Sandbox Code Playgroud)
为了得到一个long结果,避免int溢出.
4096*4096*seconds是3 ints 的乘法,结果是a int,在分配给long变量之前可能会溢出.
附:
long result = (4096*4096*seconds);
Run Code Online (Sandbox Code Playgroud)
result确实可以保留该值,但计算仅使用int类型进行,因为它只对ints 执行算术运算.
因此表达式的结果将是一个int,并且您稍后会将其放入,long但不会在您丢失信息之前.
您可以强制将Java的使用long为中间结果简单地通过将第一常数long:
long result = 4096L * 4096 * seconds;
Run Code Online (Sandbox Code Playgroud)
尽管让它们变得更加长久以使你的意图更清晰可能更为谨慎.
这包含在Java语言规范中:
数字提升应用于算术运算符的操作数.数字促销上下文允许使用标识转换,扩展基元转换或取消装箱转换.
数字促销用于将数字运算符的操作数转换为公共类型,以便可以执行操作.两种数字促销是一元数字促销和二进制数字促销.
一个其他的解决办法是让函数调用自身加宽的数据类型,喜欢的东西:
public long amountOfData (long seconds) {
return seconds * 4096 * 4096;
}
Run Code Online (Sandbox Code Playgroud)
这将产生类似的效果,因为seconds现在将是一个long计算将作为a long.它还会缩短您的代码.