gpt4 book ai didi

C 移位(字符移位)!

转载 作者:行者123 更新时间:2023-11-30 21:25:42 28 4
gpt4 key购买 nike

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

欢迎所有帮助:)

最佳答案

这说明了如何在我的小端机器上写入大端值。更多解释:&0xff 部分屏蔽了除移位值的最低有效 8 位之外的所有内容,尽管我不确定该值或 (unsigned char) 是否是绝对必要的,我包含了一个没有它们的宏 n2n() 作为比较。没有它们,我不会收到编译器警告,也不会出现错误。

此外,我还省略了上面评论中讨论的L。另请注意,使用的指针必须是 unsigned char 类型 - 如果它是 unsigned int 类型,c 将增加 4 (32位架构)。这就是为什么我使用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;
}

程序输出:

Input  12345678
Output 78563412

Input 89ABCDEF
Output EFCDAB89

关于C 移位(字符移位)!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27568449/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com