今天我开始怀疑MSDN中的某些东西. 本文演示了如何增加.NET 4.5和x64下的数组可分配的内存.这是一个很好的功能,但微软提供的描述中有些东西会影响我.
在"备注"部分,他们说:
对于字节数组和单字节结构数组,任何单个维度的最大索引为2,147,483,591(0x7FFFFFC7),对于其他类型,最大索引为2,146,435,071(0X7FEFFFFF).
由于我主要有int[]或double[]后一个数字与我的索引相关.我可以创建一个数组int[] TestArray = new int[2146435071],这很好.但是,在同一部分,微软声明:
数组中的最大元素数是UInt32.MaxValue.
哪个(根据MSDN):
这个常数的值是4,294,967,295; 也就是十六进制0xFFFFFFFF.
现在.如果我做对了,我可以有一个最多4,294,967,295个元素的数组(例如ints),但是由于数组被a索引int而不是uint我无法访问数据的"上半部分"?
这让我很困惑,看起来我似乎缺少必要的东西.
我希望你能开导我
亲切的问候
编辑:
我知道我可以创建多维数组,但是长度为2e9且宽度为2的数组似乎有点愚蠢.不管多维数组是否映射到一维数组?
我正在努力让自己了解耐力和排序。
编辑:正如评论中指出的那样,字节顺序与我的问题无关,但我希望将其放在此处只是为了完整性。至少没有人与我的“定义”相矛盾。
到目前为止,我学到了什么:如果一个值(也许一个单词)由一个以上的字节(单词:2个字节)组成,则有两种不同的方法将该值保存在连续的内存块中。假设我们有一个十进制值43210(0xA8CA,1010100011001010)
BigEndian(第一个)保存字节,这将对较低地址的值大小产生更大的影响,这有点像我们编写普通的阿拉伯数字一样。
Memory address | 1000 | 1001
---------------|--------|---------
Bytes | A8 | CA
Run Code Online (Sandbox Code Playgroud)LittleEndian(第一个)保存字节,这将对较低地址的值大小产生较小的影响
Memory address | 1000 | 1001
---------------|--------|---------
Bytes | CA | A8
Run Code Online (Sandbox Code Playgroud)它是否正确?
我了解到的第二件事是,有两种不同的方法可以将一个字节的位保存在内存中(坚持使用43210 和 BigEndian):
类似于BigEndian,最高有效位(最前/最左边)保存字节,这些位首先在内存中对数值大小的影响最大,再次是:写阿拉伯数字时。
Memory address | 1000 | 1001
Bit values |128|64 |32 |16 |8 |4 |2 |1 |128|64 |32 |16 |8 |4 |2 |1 |
--------------------------------------------------------------------------------
Bits | 1 0 1 0 1 0 0 0 | 1 1 0 0 1 0 1 …Run Code Online (Sandbox Code Playgroud)