当前位置 博文首页 > dadalaohua的博客:【C语言笔记】【宏定义系列】 重复值
宏定义系列内容。用于记录各式各样有用或者没用的宏定义?。
用于将一个unsigned char类型的数值,以多次重复的形式,返回一个unsigned long类型的数值。
例如unsigned char类型的数值为0x5f,如果使用平台的unsigned long类型长度为32位,那么返回的unsigned long类型的数值为0x5f5f5f5f。
该宏定义来自linux kernel 5.10。
#define REPEAT_BYTE(x) ((~0ul / 0xff) * (x))
宏定义中:
x表示要重复的值。
注意x不能大于0xff,否者结果会出错,返回一个奇怪的数值。
示例程序用于重复0x5f。
int main(int argc, char* argv[])
{
unsigned char x;
unsigned long y;
x = 0x5f;
y = REPEAT_BYTE(x);
printf("0x%x REPEAT_BYTE 0x%lx\n", x, y);
return 0;
}
~0ul / 0xff
先使用unsigned long类型的最大值去除以0xff。
得到的结果,每8个bit的值都是1。如果使用的平台unsigned long类型长度为32位,那么会得到结果0x11111111。
(~0ul / 0xff) * (x)
第一步得到的数乘以x
,因为每8个bit的值都是1,所以相乘之后,每8个bit的值都是x
,也就是我们要的结果。
linux kernel 5.10
本文链接:https://blog.csdn.net/u012028275/article/details/118072194
cs