Aym*_*udi 11 .net c# numerical value-type
如MSDN中所描述的BigInteger是:
表示任意大整数的不可变类型,其理论上的值没有上限或下限.
正如我ValueType所知,BigInteger是一个,我知道,ValueType的最大大小必须为16个字节.
MSDN进一步说:
对于导致BigInteger值过大的任何操作,都可以抛出OutOfMemoryException.
和更多 :
尽管此过程对调用者是透明的,但它确实会导致性能下降.在某些情况下,尤其是在非常大的BigInteger值的循环中执行重复操作时
它怎么能存储如此大的价值double.MaxValue + double.MaxValue?我被告知它ReferenceType内部有一些对象,但我在VisualStudio中定义的所有内容都是ValueTypes.
它的真正限制是什么?即使没有,它如何"作为一种价值类型"设法存储所有数据量?
Jon*_*eet 17
正如我所知,BigInteger是一个ValueType,据我所知,ValueType的最大大小必须为16个字节.
不,那不是真的.这是一个传统的限制,但是对于值类型而言,完全可行.例如:
public struct Foo {
private readonly int a, b, c, d, e; // Look ma, 20 bytes!
}
Run Code Online (Sandbox Code Playgroud)
但是,我强烈怀疑BigInteger实际上包含对字节数组的引用:
public struct BigInteger {
private readonly byte[] data;
// Some other fields...
}
Run Code Online (Sandbox Code Playgroud)
(穆斯林奔Dhaou的回答显示了使用一个当前的实现int和uint[],但当然,细节的这是有意隐藏.)
因此,价值的BigInteger仍然可以很小,但它可以指的记忆一大块-如果没有足够的内存来分配,当你执行一些操作有什么需要,你会得到一个异常.
它怎么能存储像double这样的大值.MaxValue + double.MaxValue?
好吧BigInteger是整数,所以我不会特别想用它做任何事情double......但从根本上来说,限制将取决于你有多少内存和CLR可以应付的数组大小.实际上,在实际达到任何特定数字的限制之前,你会谈论大量的数字 - 但如果你有数量较少的数字,那显然也有很大的内存需求.
作为Jon Skeet答案的确认,我查看了源代码BigInteger.它实际上包含两个内部属性如下:
internal int _sign;
internal uint[] _bits;
Run Code Online (Sandbox Code Playgroud)
_bits 几乎所有私有/公共方法都使用它们来读取/写入实际数据.
_sign用于保持标志BigInteger.
私有方法广泛使用二元运算符和计算.以下是类中使用的一小部分常量,可能反映了一些限制:
private const int knMaskHighBit = -2147483648;
private const uint kuMaskHighBit = 2147483648U;
private const int kcbitUint = 32;
private const int kcbitUlong = 64;
private const int DecimalScaleFactorMask = 16711680;
private const int DecimalSignMask = -2147483648;
Run Code Online (Sandbox Code Playgroud)
PS:我应该对JS回答发表评论,但是评论太短了.要查看源代码,请下载或反编译System.Numerics.dll.
小智 5
TL;DR:BigInteger 最大值为 2^68685922272
在 .Net 4.7.2 中,BigInteger 使用 uint 数组来表示位。
一个 uint 保存 32 位数据。
数组的最大大小定义为internal const int MaxArrayLength = 0X7FEFFFFF;
7FEFFFFF = 2146435071
现在,计算:数组的最大大小 x 每个 uint 的容量为:2146435071 x 32 = 68685922272。但这只是 BigInteger 中的位数。
这意味着 BigInteger 的最大值是:2^68'685'922'272,这是非常大的(使用 ' 是为了更容易阅读)。
如果他们决定增加数组的最大大小,那么它也会增加 BigInteger 的最大值。
| 归档时间: |
|
| 查看次数: |
10302 次 |
| 最近记录: |