2

我正在研究大端和小端

1.| \以下代码的目的是什么?

...

#elif defined(LITTLE_ENDIAN) && !defined(BIG_ENDIAN)

  #define htons(A) ((((uint16_t)(A) & 0xff00) >> 8) | \
                    (((uint16_t)(A) & 0x00ff) << 8))
...

2. 代码中的目的是什么(A)

4

4 回答 4

16

'|' 是按位或运算符。它基本上结合了价值观。'A' 是来自#define htons 的参数。它被括在括号中,这样表达式就不会混淆程序员或编译器。'\' 将宏继续到下一行。(宏通常在行尾结束。)

该宏取 A 中的 16 位值并屏蔽掉前 8 位。然后它获取该值并将其右移 8 位。这意味着前 8 位现在位于 16 位值的底部。接下来,它会屏蔽掉 A 中原始值的前 8 位,并将剩下的 8 位移位。这意味着底部的 8 位现在位于顶部。最后,它将两个值重新组合为一个值。

最终结果是顶部和底部字节交换了它们的位置。

于 2009-07-21T00:20:14.310 回答
4

这段代码只不过是标准的 C 预处理器宏。

|按位或运算符。转义换行符,\以便#define可以继续到下一行。(A)是宏的参数。

于 2009-07-21T00:16:50.843 回答
3

| 对两个整数执行按位“或” \ 是一个转义字符,允许 #define 继续到下一行

于 2009-07-21T00:16:41.483 回答
2

它是一个宏,当你使用它时它会得到扩展。

如果您使用(“调用”)宏作为

uint16_t i = htons(0x1234);

它将扩展为:

uint16_t i =  ((((uint16_t)(0x1234) & 0xff00) >> 8) |(((uint16_t)(0x1234) & 0x00ff) << 8));

这与函数中的变量没有什么不同,例如

uint16_t htons(uint16_t A) 
{
   return (A & 0xff00) >> 8) | (A & 0x00ff) << 8);
}
于 2009-07-21T00:20:35.603 回答