小编lhi*_*onk的帖子

数组中的最大元素数与最大索引器值

今天我开始怀疑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的数组似乎有点愚蠢.不管多维数组是否映射到一维数组?

c# arrays maxlength .net-4.5

8
推荐指数
1
解决办法
505
查看次数

C#字节和BitArray中的位排序

我正在努力让自己了解耐力和排序。

编辑:正如评论中指出的那样,字节顺序与我的问题无关,但我希望将其放在此处只是为了完整性。至少没有人与我的“定义”相矛盾。

到目前为止,我学到了什么:如果一个值(也许一个单词)由一个以上的字节(单词: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)

c# byte endianness bit

5
推荐指数
1
解决办法
2439
查看次数

标签 统计

c# ×2

.net-4.5 ×1

arrays ×1

bit ×1

byte ×1

endianness ×1

maxlength ×1