【发布时间】:2013-10-24 21:09:52
【问题描述】:
我对小端/大端有些困惑。好像我不见了
某事简单。一些反馈表示赞赏。
例如,假设我们有两个函数分别检索
的最低和最高有效字节
32位值:
#define LSB(x) ((x) & 0x000000FF)
#define MSB(x) ((x) & 0xFF000000)
我的问题是:以上两个函数在 big endian 和 little endian 机器上是否返回正确的结果both?
现在我将解释为什么我会感到困惑。 想象一下我们在一个小端机器上。在小端机器上,整数 9 存储在内存中,如下所示(十六进制): 09 00 00 00 (最低有效字节在前) 现在在某个时候,你可能会想,如果我们使用上面的 LSB 函数,那么我们将结束 加上这样的表达式: 09 00 00 00 & 00 00 00 FF 这是 0 - 但当然这不是上面的 LSB 函数最终会如何工作。所以看来我错过了。任何帮助表示赞赏。
另外,如果我说 int y = 0x000000FF - 无论机器的字节序如何,这都是 255,对吧?
【问题讨论】:
-
OT:不应该是
#define MSB(x) (((x) & 0xFF000000) >> 24)还是#define MSB(x) ((x) >> 24)(假设传递了一个32位的值)? -
您可能需要
MSB(x) = ((x) >> 24),否则if (MSB(x) == 0xFF) ...之类的代码将不起作用。 -
好的,我会研究一下,但目前我并不特别关心 LSB 和 MSB 函数的最佳实现
标签: c bitwise-operators