Java BigInteger有上限吗?

Java BigInteger有上限吗?,java,biginteger,Java,Biginteger,可能重复: biginger的Javadoc没有定义任何最大值或最小值。然而,它确实说: (增加重点) 不可变任意精度整数 即使在理论上,也有这样一个最大值吗?或者说,biginger的操作方式根本不同,以至于实际上除了计算机上可用的内存量之外没有最大值?数字保存在int[]中-数组的最大大小是Integer.MAX\u值。因此,最大的BigInteger可能是(2^32)^Integer.MAX\u VALUE 诚然,这取决于实现,而不是规范的一部分 在Java 8中,添加了一些信息,给出

可能重复:

biginger
的Javadoc没有定义任何最大值或最小值。然而,它确实说:

(增加重点)

不可变任意精度整数


即使在理论上,也有这样一个最大值吗?或者说,
biginger
的操作方式根本不同,以至于实际上除了计算机上可用的内存量之外没有最大值?

数字保存在
int[]
中-数组的最大大小是
Integer.MAX\u值。因此,最大的BigInteger可能是
(2^32)^Integer.MAX\u VALUE

诚然,这取决于实现,而不是规范的一部分


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

biginger
必须支持范围
-2
Integer.MAX\u VALUE
(独占)到
+2
Integer.MAX\u VALUE
(独占)的值,并且可以支持该范围之外的值

实现说明:
biginger
当结果超出支持的
-2
(独占)到
+2
Integer.MAX_值
(独占)范围时,构造函数和操作将抛出
算术异常


第一个最大值是字符串的长度,它是231-1位。它比BigInteger的最大值小得多,但是如果不能打印,它会丢失很多值

BigInteger只有在您知道它不是十进制且 长数据类型可能不够大。 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;
110/**
111*这个大整数的大小,以大端序表示:
此数组的112*第0个元素是
113*震级。震级必须是“最小”的,因为它是最显著的
114*int({@code mag[0]})必须为非零。这是必要的
115*确保每个BigInteger只有一个表示形式
116*价值。请注意,这意味着BigInteger零具有
117*零长度mag阵列。
118        */
119最终国际[]杂志;

维基百科文章:

几种现代编程语言都内置了对 bignums和其他一些库可用于任意精度 整数和浮点数学。而不是将值存储为固定值 与处理器寄存器大小相关的二进制位数, 这些实现通常使用可变长度的数字数组


由于这些值用作无符号的
int
值,因此最大值更像
(2^32)^Integer.MAX\u VALUE*10^Integer.MAX\u VALUE
,因为它也可以缩放。@PeterLawrey您确定BigInteger有缩放吗?(BigDecimal有一个)。由于整数MAX_值约为2^31,最大值不能保存在32位计算机内存中:)因此内存是有限的。@SuzanCioc您可以在64位计算机上存储一个2^32整数数组(假设您有足够的RAM)。@assylias很好。您还可以在64位JVM中存储
新int[2^31-1]
。它大约8GB,价格约为40美元。理论上没有限制。在可能的副本中,公认的答案没有指定
BigInteger
的理论限制;或者,如果它真的没有,它也无法解释原因。相反,它只是说,如果有一个最大值,它将永远不会影响您当前的内存限制。它可能在基数2中,所以在基数2中,最大值是(2^32)^Integer.max_值。@Ran,
biginger.valueOf(2).pow(500500)
为我返回了一些东西。@Ran,“不返回任何东西”在Java中没有任何意义。公平地说,您只需要更多的逻辑来打印它。如果可以使用多个字符串,您也可以使用多个大整数。;)是的,但这将导致代码中比打印例程复杂得多的问题。