我学习大和小字节序

<强> 1。什么是| \的在下面的代码的目的吗

...

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

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

<强> 2。什么是(A)的代码中的目的吗

有帮助吗?

解决方案

在 '|'是位或运算符。它基本上结合了值。在“A”是从#定义htons参数。它是用括号括起来,这样的表达就不会混淆程序员或编译器。在“\”延续了宏到下一行。 (A宏通常在该行的末尾。)

这个宏取入A和掩模16位值从顶部8位。然后它需要该值,并转移它右8位。这意味着现在顶端8位上的16位值的底部。它下一个掩模于A的原始值的顶部8比特,并转移这些左8位。这意味着现在的低8位是在顶部。最后,重组这两个值回一个值。

最终的结果是,在顶部和底部字节有他们的地方交换。

其他提示

此代码只不过是标准C-预处理宏更多。

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

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

这是一个宏,它会得到,当你使用它扩大。

如果您例如使用( “呼叫”)的宏作为

uint16_t i = htons(0x1234);

它将扩展为:

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

这并不是说不同于函数的变量,e.g。

uint16_t htons(uint16_t A) 
{
   return (A & 0xff00) >> 8) | (A & 0x00ff) << 8);
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top