长期不足以存储整数

Jon*_*tan 1 java long-integer

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变量之前可能会溢出.


pax*_*blo 6

附:

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.它还会缩短您的代码.