我正在研究大端和小端。
1.| \
以下代码的目的是什么?
...
#elif defined(LITTLE_ENDIAN) && !defined(BIG_ENDIAN)
#define htons(A) ((((uint16_t)(A) & 0xff00) >> 8) | \
(((uint16_t)(A) & 0x00ff) << 8))
...
2. 代码中的目的是什么(A)
?
我正在研究大端和小端。
1.| \
以下代码的目的是什么?
...
#elif defined(LITTLE_ENDIAN) && !defined(BIG_ENDIAN)
#define htons(A) ((((uint16_t)(A) & 0xff00) >> 8) | \
(((uint16_t)(A) & 0x00ff) << 8))
...
2. 代码中的目的是什么(A)
?
'|' 是按位或运算符。它基本上结合了价值观。'A' 是来自#define htons 的参数。它被括在括号中,这样表达式就不会混淆程序员或编译器。'\' 将宏继续到下一行。(宏通常在行尾结束。)
该宏取 A 中的 16 位值并屏蔽掉前 8 位。然后它获取该值并将其右移 8 位。这意味着前 8 位现在位于 16 位值的底部。接下来,它会屏蔽掉 A 中原始值的前 8 位,并将剩下的 8 位移位。这意味着底部的 8 位现在位于顶部。最后,它将两个值重新组合为一个值。
最终结果是顶部和底部字节交换了它们的位置。
这段代码只不过是标准的 C 预处理器宏。
是|
按位或运算符。转义换行符,\
以便#define
可以继续到下一行。(A)
是宏的参数。
| 对两个整数执行按位“或” \ 是一个转义字符,允许 #define 继续到下一行
它是一个宏,当你使用它时它会得到扩展。
如果您使用(“调用”)宏作为
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);
}