在Java中乘以大整数后达到零

时间:2018-05-01 01:13:45

标签: java

我有以下方法:

int x= (int) Math.pow(2, 5);
for (int k=1; k <= 3; k++) {
    x *= (2*x);
}
System.out.println(x); // prints 0

它只是将x初始化为32,然后在循环的每次迭代中将其乘以其double。但是,我希望输出是一个大数字或至少是一个错误,但最终输出为0. 不,我尝试通过添加这个来做一些调试:

int x= (int) Math.pow(2, 5);
for (int k=1; k <= 3; k++) {
    System.out.println(x + " * " + 2 * x);
    x *= (2*x);
}
System.out.println(x);

但输出是这样的:

32 * 64
2048 * 4096
8388608 * 16777216
0

有没有人知道为什么数字突然变为0?

2 个答案:

答案 0 :(得分:1)

二进制32是100000,幂为2.您的“更新程序”x = 2 * x * x;维护此属性 - x始终是(更大)2的幂。最后一次迭代,您看到x溢出,因为int数据类型只存储32位,而x的二进制表示形式超过32位。打印的值恰好是0,因为x的最低32位都是0(因为x是2的非常大的幂),{{1} } {32} int0

答案 1 :(得分:0)

您只需查看标准原始整数溢出,其最大值为2,147,483,647。 Java有一个类BigInteger,它可以使用更大的范围(没有理论限制):

BigInteger x= new BigInteger(String.valueOf((int)Math.pow(2, 5)));
for (int k=1; k <= 3; k++) {
    System.out.println(x + " * " + x.multiply(new BigInteger("2")));
    BigInteger twice = x.multiply(new BigInteger("2"));
    x = x.multiply(twice);
}
System.out.println(x);

32 * 64
2048 * 4096
8388608 * 16777216
140737488355328

Demo