Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.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_Biginteger_Integer Overflow - Fatal编程技术网

Java 没有限制的大整数是什么意思?

Java 没有限制的大整数是什么意思?,java,biginteger,integer-overflow,Java,Biginteger,Integer Overflow,我对此进行了调查,特别是我不理解这一行(斜体字): 在BigInteger类中,我没有限制,并且有一些有用的 功能,但它是相当令人沮丧的转换您的美丽 用于处理BigInteger类的代码,特别是在原语 运算符不在那里工作,您必须使用此类中的函数 我不知道我遗漏了什么,但要表达一些没有限制的东西,你需要无限的记忆吗?这里的诀窍是什么?没有理论限制。biginger类根据需要为其保存的所有数据位分配尽可能多的内存 然而,根据可用的内存,存在一些实际限制。还有进一步的技术限制,尽管你不太可能受到影响:

我对此进行了调查,特别是我不理解这一行(斜体字):

在BigInteger类中,我没有限制,并且有一些有用的 功能,但它是相当令人沮丧的转换您的美丽 用于处理BigInteger类的代码,特别是在原语 运算符不在那里工作,您必须使用此类中的函数

我不知道我遗漏了什么,但要表达一些没有限制的东西,你需要无限的记忆吗?这里的诀窍是什么?

没有理论限制。
biginger
类根据需要为其保存的所有数据位分配尽可能多的内存


然而,根据可用的内存,存在一些实际限制。还有进一步的技术限制,尽管你不太可能受到影响:一些方法假设这些位可以通过
int
索引寻址,所以当你超过
Integer.MAX_VALUE
位时,事情就会开始破裂

格雷厄姆对这个问题给出了很好的回答。我只想补充一点,您必须小心使用
valueOf
方法,因为它是使用
long
参数创建的,所以最大值是
long。MAX_value
是,当我们需要任意精度的非常大的数字时,它会被使用。需要注意的是,“任意”精度或位数并不意味着“无限”:它意味着计算中的位数或精度位数受到内存和/或我们指定的精度限制的限制。

查看BigInteger类源代码,您将看到(可以使用NetBean完成)。数字将表示为int数组。例如,10113将是[1,0,1,1,3](这并不完全是BigInteger类所做的,只是一个大数字模块工作的示例)。因此,从技术上讲,它的唯一限制将是内存。

它非常类似于字符串或字节[](虽然我认为这些在技术上仅限于整数可寻址元素)。@Thilo:BigInteger也是如此:数据保存在int[]中,这在理论上限制了它所能表示的数字的大小。@MichaelBorgwardt支持int[]数组肯定是一个实现细节,而不是指定的行为,不是吗?Java中的数组当前只能有2^32个元素。有些人想要2^64。BigInteger将其位存储在int[]中,因此它最多可以存储2^32个int,即2^37位。非常大。@Graham Borland:backing int[]是一个实现细节,但BigInteger API有几个方法使用int参数访问第n位,而toString()方法间接限制了BigInteger实现的理论大小,因为数字必须表示为字符串。因此,BigInteger不能大于2^(2^31-1)-1,这比支持int数组施加的限制小得多。采用长参数的构造函数显然不能超出此限制,但存在采用字符串或字节数组的构造函数。没有采用
long
作为参数的公共构造函数。只有一个getter(文档中有关于丢失信息的警告).No real无需小心,因为如果您试图编写的文字长度超过
long.MAX\u值,则
biginger.valueOf(long)
方法会给您带来编译错误。此外,构建一个大得多的biginger很容易,比如
biginger.valueOf(10).pow(10000)
请参见: