Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的大整数相乘后达到零_Java - Fatal编程技术网

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次幂),并且带有32
0
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