BigInteger没有限制意味着什么?

Gee*_*eek 49 java integer-overflow biginteger

我查看了与Big Integer有关的stackoverflow问题,特别是我不理解这一行(斜体字):

在BigInteger类中,我没有限制,并且有一些有用的函数,但将你漂亮的代码转换为使用BigInteger类非常令人沮丧,特别是当原始操作符不能在那里工作时你必须使用这个类中的函数.

我不知道我错过了什么,但代表一些没有限制的东西,你需要无限的记忆?这是什么诀窍?

Gra*_*and 81

没有理论上的限制.的BigInteger,因为它需要为它被要求保存数据的所有位级分配尽可能多的内存.

然而,存在一些实际限制,由可用存储器决定.还有其他技术限制,虽然你不太可能受到影响:有些方法假设这些位可以被int索引寻址,所以当你超过Integer.MAX_VALUE位时,事情就会开始破坏.

  • @Graham Borland:支持int []是一个实现细节,但BigInteger API有几个方法使用int参数访问第n位,而toString()方法间接限制BigInteger实现的理论大小,因为数字必须是可表示为String.因此,BigInteger不能大于2 ^(2 ^ 31-1)-1,这远远小于back int数组所施加的限制. (6认同)
  • Java中的数组当前只能有2 ^ 32个元素.有些人想要2 ^ 64.BigInteger将其位存储在int []中,因此它最多可以存储2 ^ 32个int,即2 ^ 37位.挺大的. (5认同)
  • @Thilo:BigInteger也是如此:数据保存在int []中,它对它可以表示的数字大小设置了理论上的限制. (2认同)
  • @MichaelBorgwardt 支持 int[] 数组肯定是一个实现细节,而不是被指定的行为,不是吗? (2认同)

Ada*_*der 16

格雷厄姆对这个问题给出了很好的答案.我只想补充一点,你必须小心valueOf方法因为它是使用long参数创建的,所以最大值是Long.MAX_VALUE.

  • 没有必要小心,因为如果你试图写一个超过`Long.MAX_VALUE`的文字,`BigInteger.valueOf(long)`方法会给你一个编译错误.此外,构建BigInteger更容易,比如说BigInteger.valueOf(10).pow(10000)` (4认同)
  • 采用long参数的那个显然不能超越,但有一些构造函数采用字符串或字节数组. (3认同)

Edu*_*ard 5

是的,当我们需要具有任意精度的非常大的数字时使用它。重要的是要注意,“任意”精度或位数并不意味着“无限制”:这意味着计算中的位数或精度位数受内存和/或定义的精度限制限制我们指定的。