C换档(字符移位)!

时间:2014-12-19 14:51:14

标签: c

我需要一些帮助来理解这段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))

欢迎所有帮助:)

1 个答案:

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