我正在研究big and little-endianness。
1。以下代码中| \
的目的是什么?
...
#elif defined(LITTLE_ENDIAN) && !defined(BIG_ENDIAN)
#define htons(A) ((((uint16_t)(A) & 0xff00) >> 8) | \
(((uint16_t)(A) & 0x00ff) << 8))
...
2。代码中(A)
的目的是什么?
答案 0 :(得分:16)
'|'是按位OR运算符。它基本上结合了价值观。 'A'是#define htons的参数。它括在括号中,因此表达式不会混淆程序员或编译器。 '\'将宏继续到下一行。 (宏通常在行的末尾结束。)
该宏取A中的16位值并屏蔽前8位。然后它取该值并将其右移8位。这意味着前8位现在位于16位值的底部。它接下来屏蔽A中原始值的前8位,并将那些左8位移位。这意味着最后8位现在位于顶部。最后,它将两个值重新组合成一个值。
最终结果是顶部和底部字节的位置已交换。
答案 1 :(得分:4)
此代码只不过是标准的C预处理器宏。
|
是按位OR运算符。 \
转义换行符,以便#define
可以继续到下一行。 (A)
是宏的参数。
答案 2 :(得分:3)
|在两个整数上执行按位“或” \是一个转义字符,允许#define连接到下一行
答案 3 :(得分: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);
}