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中没有任何意义。公平地说,您只需要更多的逻辑来打印它。如果可以使用多个字符串,您也可以使用多个大整数。;)是的,但这将导致代码中比打印例程复杂得多的问题。