长期不足以存储整数

时间:2015-02-26 07:42:37

标签: 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;
    }

}

此代码在我的测试中返回,错误:预期的amountData(1000):< 16777216000>但是:< -402653184>。难道不能输入 long 存储更高的整数吗?或者如果不是如何使这个代码工作?

2 个答案:

答案 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完成。它还会缩短你的代码。