你知道为什么下面程序的输出是
1000
2000
如果你能帮助我,我非常感激!这是节目单。
int main()
{
int t[] = { 1, 2 };
char* p = (char*)t;
int i;
for (i = 0; i < sizeof(t); i++)
{
printf("%d", *(p + i));
if (i % sizeof(t[0]) == sizeof(t[0]) - 1) printf("\n");
}
return 0;
}
2条答案
按热度按时间kqlmhetl1#
它将
t
的值中的每个字节的值打印为数值。最后的if
语句看起来很混乱,但只是检查它是否在最后一个元素,然后在退出前添加一个换行符。下面是以更可读的形式重写的代码。这段代码的目标很可能是显示你是否使用big or little endian。从你的输出中我们可以看出你使用的是little endian。如果是big endian,它会输出
00010002
。1dkrff032#
您可以通过将printf更改为
printf("%d ", p[i]);
来使其更加清晰。代码的作用是逐字节迭代
int
数组。C语言中的一个特殊规则允许我们检查几乎任何类型的原始数据,通过使用指向字符类型的指针,然后访问单个字节。但是,由于Is char signed or unsigned by default?的原因,
char
不是一个很好的选择。请改用unsigned char
或uint8_t
。至于为什么值为
1
的int
的原始字节表示形式为1 0 0 0
,这是因为您的系统恰好是一个32位int
小字节序系统。What is CPU endianness?if (i % sizeof(t[0]) == sizeof(t[0]) - 1) printf("\n");
部分只是打印4个字节后的新行。程序的完整重写可能如下所示: