BigInteger是否有上限?

2022-08-31 10:30:13

可能的重复:
没有限制的BigInteger是什么意思?

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

(着重号后加)

不可变任意精度整数

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


答案 1

该数字保存在 - 数组的最大大小为 。因此,最大的 BigInteger 可能是 .int[]Integer.MAX_VALUE(2 ^ 32) ^ Integer.MAX_VALUE

诚然,这与实现有关,而不是规范的一部分。


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

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

实现说明:当结果超出 Integer.MAX_VALUE(独占)到 Integer.MAX_VALUE(独占)的受支持范围时构造函数和操作将引发。BigIntegerArithmeticException-2+2


答案 2

只有当您知道它不会是小数,并且长数据类型可能不够大时,才会使用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;

源头

来自维基百科文章任意精度算术

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


推荐