请考虑以下代码:
static void Main(string[] args) { int max = 1024; var lst = new List(); for (int i = 1; i <= max; i *= 2) { lst.Add(i); } var arr = lst.ToArray(); IterateInt(arr); Console.WriteLine(); IterateShort(arr); Console.WriteLine(); IterateLong(arr); } static void IterateInt(int[] arr) { Console.WriteLine("Iterating as INT ({0})", sizeof(int)); Console.WriteLine(); unsafe { fixed (int* src = arr) { var ptr = (int*)src; var len = arr.Length; while (len > 0) { Console.WriteLine(*ptr); ptr++; len--; } } } } static void IterateShort(int[] arr) { Console.WriteLine("Iterating as SHORT ({0})", sizeof(short)); Console.WriteLine(); unsafe { fixed (int* src = arr) { var ptr = (short*)src; var len = arr.Length; while (len > 0) { Console.WriteLine(*ptr); ptr++; len--; } } } } static void IterateLong(int[] arr) { Console.WriteLine("Iterating as LONG ({0})", sizeof(long)); Console.WriteLine(); unsafe { fixed (int* src = arr) { var ptr = (long*)src; var len = arr.Length; while (len > 0) { Console.WriteLine(*ptr); ptr++; len--; } } } }
现在,我绝不会在这个舞台上有充分的理解.我也没有任何真正的期望.我正在尝试并尝试学习.然而,根据关什么我迄今读,我不明白,我得到的结果short
和long
.
据我所知,原始的int[]
,当一次读取1个位置(即arr + i
)时,4
由于数据类型的大小,一次读取字节,因此该值*ptr
当然是整数值.
但是,short
我不太明白为什么每个偶数迭代都是0
(或者可以说是奇怪的迭代,具体取决于你的根参考).我的意思是我可以看到模式.每次迭代4个字节时,我都会在内存中得到真正的积分值(就像迭代一样int*
),但是为什么0
每个其他结果呢?
然后long
迭代甚至超出了我的理解; 我甚至不知道该说什么或假设在那里.
Iterating as INT (4) 1 2 4 8 16 32 64 128 256 512 1024 Iterating as SHORT (2) 1 0 2 0 4 0 8 0 16 0 32 Iterating as LONG (8) 8589934593 34359738372 137438953488 549755813952 2199023255808 -9223372036854774784 96276819136 32088581144313929 30962698417340513 32370038935650407 23644233055928352
什么是真正与发生short
和long
反复?
当你说它pointer[index]
给你sizeof(type)
位置的字节pointer + index * sizeof(type)
.因此,通过更改"迭代"的类型,您可以更改步幅.
随着short
你看过原著的一半int
的.小的上半部分全部为零.
在long
你同时阅读两个int
人的同时,强迫一个人long
.在ptr[0]
你正在阅读,例如,(1L << 32 | 2L)
这是一个大数目.
但是,您仍在使用Length
以int为单位测量的原始值,这是一个错误.在long
-case中,您正在读取数组的边界之外,short
如果您阅读的内容太少.