我有以下方法:
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?
答案 0 :(得分:1)
二进制32是100000
,幂为2.您的“更新程序”x = 2 * x * x;
维护此属性 - x
始终是(更大)2的幂。最后一次迭代,您看到x
溢出,因为int
数据类型只存储32位,而x
的二进制表示形式超过32位。打印的值恰好是0
,因为x
的最低32位都是0
(因为x
是2的非常大的幂),{{1} } {32} int
是0
。
答案 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