昨天,有人给我看了这段代码:
#include <stdio.h>
int main(void)
{
unsigned long foo = 506097522914230528;
for (int i = 0; i < sizeof(unsigned long); ++i)
printf("%u ", *(((unsigned char *) &foo) + i));
putchar('\n');
return 0;
}
这导致:
0 1 2 3 4 5 6 7
我很困惑,主要是for
循环中的行。据我所知,似乎&foo
被转换为 anunsigned char *
然后被i
. 我认为这*(((unsigned char *) &foo) + i)
是一种更冗长的写作方式,((unsigned char *) &foo)[i]
但这看起来像是正在被索引。如果是这样,为什么?循环的其余部分似乎是典型的打印数组的所有元素,所以一切似乎都表明这是真的。演员阵容让我更加困惑。我尝试在 google 上专门搜索有关将整数类型转换为的内容,但在一些关于转换为、等的无用搜索结果专门打印出来后,我的研究陷入了困境foo
unsigned long
unsigned char *
char *
int
char
itoa()
506097522914230528
0 1 2 3 4 5 6 7
,但其他数字似乎在输出中显示了自己唯一的 8 个数字,并且更大的数字似乎填充了更多的零。