BigInteger有上限吗?

可能重复:
BigInteger没有限制意味着什么?

BigInteger的Javadoc没有定义任何最大值或最小值。 但是,它确实说:

(强调加)

不可变的任意精度整数

即使在理论上是否有这样的最大值? 或者, BigInteger运作方式根本不同,除了计算机上可用的内存量之外,实际上并没有最大限度的提高?

该数字保存在int[] – 数组的最大大小为Integer.MAX_VALUE 。 所以BigInteger的最大值可能是(2 ^ 32) ^ Integer.MAX_VALUE

无可否认,这是依赖于实现的,而不是规范的一部分。


在Java 8中,一些信息被添加到BigInteger javadoc中 ,给出了最小支持范围和当前实现的实际限制:

BigInteger必须支持-2 Integer.MAX_VALUE (独占)到+2 Integer.MAX_VALUE (独占)范围内的值,并且可能支持该范围之外的值。

实现注意事项:当结果超出-2 Integer.MAX_VALUE (exclusive)到+2 Integer.MAX_VALUE (exclusive)的支持范围时, BigInteger构造函数和操作抛出ArithmeticException

只有当你知道它不是十进制的时候才会使用BigInteger,并且长数据types可能不够大。 BigInteger的最大尺寸没有限制(与计算机上的RAM一样大)。

从这里 。

它使用int[]来实现:

  110 /** 111 * The magnitude of this BigInteger, in <i>big-endian</i> order: the 112 * zeroth element of this array is the most-significant int of the 113 * magnitude. The magnitude must be "minimal" in that the most-significant 114 * int ({@code mag[0]}) must be non-zero. This is necessary to 115 * ensure that there is exactly one representation for each BigInteger 116 * value. Note that this implies that the BigInteger zero has a 117 * zero-length mag array. 118 */ 119 final int[] mag; 

从源头上

从维基百科文章任意精度算术 :

一些现代的编程语言已经内置了对bignums的支持,而另外一些编程语言则提供了用于任意精度整数和浮点math的库。 这些实现不是将值存储为与处理器寄存器的大小相关的固定数量的二进制位,而是通常使用可变长度的数字数组。

你会碰到的第一个最大值是一个string的长度是2 31 -1数字。 它比BigInteger的最大值要小,但是恕我直言,如果它不能被打印的话,它将失去它的大部分价值。