我对小端和大端有些困惑。似乎我缺少了一些简单的东西。欢迎提供一些反馈。
例如,假设我们有两个函数,分别获取32位值的最低有效字节和最高有效字节:
#define LSB(x) ((x) & 0x000000FF)
#define MSB(x) ((x) & 0xFF000000)
我的问题是:上述两个函数在大端和小端机器上都能返回正确的结果吗?
现在我将解释为什么我感到困惑。 假设我们在一个小端机器上。在一个小端机器上,整数9在内存中的存储方式如下(以十六进制表示):09 00 00 00(最不重要字节在前)。 现在,在某个时刻,你可能会认为,如果我们使用上述LSB函数,那么我们最终会得到这样的表达式:09 00 00 00 & 00 00 00 FF,其结果是0 - 但当然,上述LSB函数的工作方式并不是这样的。所以我觉得似乎缺少了一些东西。非常感谢任何帮助。
此外,如果我说
int y = 0x000000FF
- 无论机器的字节序如何,它都是255,对吗?
#define MSB(x) (((x) & 0xFF000000) >> 24)
还是只需要#define MSB(x) ((x) >> 24)
(假设传递的是32位值)? - alkMSB(x) = ((x) >> 24)
,否则像if (MSB(x) == 0xFF) ...
这样的代码将无法工作。 - japreiss