题
我学习大和小字节序。
<强> 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);
}
不隶属于 StackOverflow