Java - 乘法不能按预期工作

时间:2014-02-27 14:05:21

标签: java arraylist operators

以下代码为我提供了-1894967296,但这不是预期的。究竟发生了什么?我无法弄清楚。根据我的计算器,结果必须是2400000000 :(

import java.util.List;
import java.util.ArrayList;
public class Calculate{
     public static void main(String []args){
        int result = 1;
        List<Integer> integer = new ArrayList<Integer>();
        integer.add(100);
        integer.add(200);
        integer.add(300);
        integer.add(400);
        for (Integer value : integer) {
            result *= value;
        }
        System.out.println(result);
     }
}

当我调试时,它可以正常工作直到第三次迭代。

更新

根据答案,已经超出了int原语类型范围,但int变量会发生什么?它会违约吗?

5 个答案:

答案 0 :(得分:3)

Java可以存储在int中的最大数字是2 ^ 31 - 2147483648

2400000000大于那个“环绕”。

您需要使用64位数据类型,例如long

答案 1 :(得分:1)

2400000000太大而无法存储在int中。使用long更合适,其最小值为-2 ^ 63,最大值为2 ^ 63 - 1,您的数字在此范围内。

答案 2 :(得分:0)

预期结果2400000000 > Integer.MAX_VALUE。因此,使用long代替int来存储结果。

答案 3 :(得分:0)

使用BigInteger代替int,因为int有限

Java doc:

  

int :默认情况下,int数据类型是32位带符号的二进制补码整数,其整数为&gt;最小值-231,最大值231-1。在Java SE 8及更高版本中,您可以使用int数据类型来表示无符号的32位整数,其最小值为0,最大值为232-1。使用Integer类将int数据类型用作无符号整数。有关更多信息,请参阅数字类一节。已经将诸如compareUnsigned,divideUnsigned等静态方法添加到Integer类中,以支持无符号整数的算术运算。

答案 4 :(得分:0)

大多数程序员都称之为Pillage。你不应该在一个小变量中保存一个long值,不要指望Int保存一个值2 ^ 31 +。 对于你想要做的事情,有一个long