请考虑以下代码:
static void Main(string[] args)
{
int max = 1024;
var lst = new List<int>();
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
次迭代实际发生了什么?
答案 0 :(得分:5)
当您说pointer[index]
时,它会在sizeof(type)
位置为您提供pointer + index * sizeof(type)
个字节。因此,通过更改您使用&#34;迭代的类型&#34;你改变了步伐。
short
,您可以阅读原始int
的一半。小额的上半部分全部为零。long
,您同时阅读了两个int
,强制进入long
个ptr[0]
。例如,(1L << 32 | 2L)
正在阅读Length
,这是一个很大的数字。你仍在使用以int为单位测量的原始long
,这是一个错误。在short
- 情况下,您正在数组边界外读取,在{{1}}情况下,您阅读的内容太少。