我有以下方法:
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,然后在循环的每次迭代中将其乘以它的两倍。但是,我希望输出是一个大数字或至少是一个错误,但是最终输出是 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吗?
最佳答案
32 的二进制是 100000
,是 2 的幂。您的“更新过程”x = 2 * x * x;
维护此属性 -- x
始终是 2 的(较大)幂。在最后一次迭代中,您会看到 x
溢出,因为 int
数据类型仅存储 32 位,并且x
的二进制表示形式超过 32 位。打印的值恰好是 0
,因为 x
的最低 32 位都是 0
(因为 x
是一个非常2 的大次幂),32 个 0
的 int
为 0
。
关于java - Java中大整数相乘后达到零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50110213/