要了解有关字节序的C代码

时间:2009-07-21 00:13:47

标签: c endianness

我正在研究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)的目的是什么?

4 个答案:

答案 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);
}