Java中的大整数相乘后达到零
我有以下方法:Java中的大整数相乘后达到零,java,Java,我有以下方法: int x= (int) Math.pow(2, 5); for (int k=1; k <= 3; k++) { x *= (2*x); } System.out.println(x); // prints 0 有人知道为什么数字突然变为0吗?32在二进制中是100000,是2的幂。你的“更新程序”x=2*x*x维护此属性--x始终是2的(更大)幂。在上一次迭代中,您会看到x溢出,因为int数据类型只存储32位,而x的二进制表示超过32位。打印的值正好是0,因为
int x= (int) Math.pow(2, 5);
for (int k=1; k <= 3; k++) {
x *= (2*x);
}
System.out.println(x); // prints 0
有人知道为什么数字突然变为0吗?32在二进制中是
100000
,是2的幂。你的“更新程序”x=2*x*x
维护此属性--x
始终是2的(更大)幂。在上一次迭代中,您会看到x
溢出,因为int
数据类型只存储32位,而x
的二进制表示超过32位。打印的值正好是0
,因为x
的最低32位都是0
(因为x
是一个非常大的2次幂),并且带有320
的int
是0您刚才看到的是标准原语整数溢出,其最大值为2147483647
。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
biginger x=newbiginger(String.valueOf((int)Math.pow(2,5));
对于(int k=1;k到downvoter:我基本上在问题被标记为重复之前回答了这个问题。奇怪的是,你会在不使用OP的情况下对这个答案进行downvote。数字太大,你需要使用BigInteger java导入。这将帮助你了解如何使用导入:尝试通过打印System.out.pri进行调试ntln(整数.toBinaryString(x).length())
您可以看到系列中的下一个是32
您有一个溢出,它会导致乘法运算的结果给出一个错误的值。由于Integer
在Java中是以32位编码的,所以在达到溢出之前可以分配给int
变量的最大值由Integer.MAX定义_VALUE;//2147483647
。作为解决方法,您可以使用BigInteger
进行超出此限制的计算(请参阅Tim解决方案)如果您想了解为什么结果是0
,而不是-1234578
或其他数字,请查看此链接:因此,当我达到一个大于32位的值时,Java自动默认为一个由0组成的32位整数?当您需要超过32位来存储一个整数时,Java的int
类型存储“最低”值(最低有效)32位。在您的情况下,所有最低32位恰好是0
,因为您的数字是2的大幂。
32 * 64
2048 * 4096
8388608 * 16777216
0
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