我需要一些帮助来理解这段C的代码。我不知道“L”和“\”在这里是什么? 请说明一点:)
#define l2n(l,c) (*((c)++)=(unsigned char)(((l)>>24L)&0xff), \
*((c)++)=(unsigned char)(((l)>>16L)&0xff), \
*((c)++)=(unsigned char)(((l)>> 8L)&0xff), \
*((c)++)=(unsigned char)(((l) )&0xff))
欢迎所有帮助:)
答案 0 :(得分:1)
这说明了如何在我的little-endian机器上编写big-endian值。更多解释:除了移位值的最不重要的8位之外,&0xff
部分屏蔽了所有部分,尽管由于我不确定那个或(unsigned char)
是否是严格必要的,我包含了一个宏{{1}没有他们作为比较。没有它们,我没有编译器警告也没有错误。
此外,我省略了上述评论中讨论的n2n()
。另请注意,所使用的指针必须是L
类型 - 如果它是unsigned char
类型,unsigned int
将增加4(32位架构)。这就是我使用c
覆盖字节的原因。
宏定义在其标识符和第一个括号之间必须没有空格。最后,如果宏中似乎有更多括号,那么确保正确编译任何表达式,例如union
l2n(a+b,c);
节目输出:
#include <stdio.h>
#define l2n(l,c) (*((c)++)=(unsigned char)(((l)>>24)&0xff), \
*((c)++)=(unsigned char)(((l)>>16)&0xff), \
*((c)++)=(unsigned char)(((l)>> 8)&0xff), \
*((c)++)=(unsigned char)(((l) )&0xff))
#define n2n(l,c) (*((c)++)=(l)>>24, \
*((c)++)=(l)>>16, \
*((c)++)=(l)>> 8, \
*((c)++)=(l) )
typedef union {
unsigned num;
unsigned char arr[4];
} bigend;
int main (void)
{
bigend number;
unsigned x;
char *p;
// test first macro
x = 0x12345678;
p = number.arr;
printf ("Input %08X\n", x);
l2n(x,p);
printf ("Output %08X\n\n", number.num);
// test second macro
x = 0x89ABCDEF;
p = number.arr;
printf ("Input %08X\n", x);
n2n(x,p);
printf ("Output %08X\n\n", number.num);
return 0;
}