为什么分配十六进制值会在小端机器上给出大端等效值?

Why does assigning a hex value give big-endian equivalent value on a little-endian machine?

这是一个简单的 c 语句:

uint32_t x = 0x04000000;

在我的小端机器上,我假设 x 等于 4。但实际上是 67108864。

所以一定有一些非常基本的东西我不明白。能帮忙解释一下吗?

文字0x04000000表示数字67108864。根据使用little-endian或big-endian字节顺序,它在内存中的存储方式会有所不同,但这不会改变它值。

uint32_t x = 0x04000000;

此操作与机器字节序无关。 0x04000000 是一个十六进制文字,其值为 67'108'864(十进制)。这在任何字节顺序上都是正确的。

如果您想查看字节序系统的效果,您需要 fiddle 底层内存。例如:

uint32_t x;
memcpy(&x,  (const unsigned char[4]) {0x04u, 0, 0, 0}, 4);

当您对变量赋值时,您设置的是,而不是表示

十六进制数 0x04000000 与十进制数 67108864 相同,所以这就是被分配的值。数字以十六进制表示的事实不会改变分配的工作方式。

如果你做了这样的事情:

unsigned char n[4] = "\x4\x0\x0\x0";
memcpy(&x, n, sizeof(x));

然后 x 将在 little-endian 机器上包含值 4。