为什么分配十六进制值会在小端机器上给出大端等效值?
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。
这是一个简单的 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。