【发布时间】:2014-05-21 21:16:34
【问题描述】:
我正在查看 /usr/src/linux-headers-3.11-.../include/linux/ 中 kernel.h 头文件中的代码,我偶然发现了这个宏(第 47 行):
#define REPEAT_BYTE(x) ((~0ul / 0xff) * (x))
运行这个例子后我做了:
#include <stdio.h>
#define REPEAT_BYTE(x) ((~0ul / 0xff) * (x))
int main(void)
{
long z = 12;
fprintf(stderr, "\tz = %ldd (0x%lX)\n"
"\tREPEAT_BYTE(%ldd) = %ldd (0x%lX)\n",
z, z, z, REPEAT_BYTE(z), REPEAT_BYTE(z));
return 0;
}
我已经弄清楚它的作用:它在0 和255(包括它们)之间接收一个int,所以任何一个字节长的int,它都会重复那个字节。查看输出时,这一点很明显(宏名称除外):
z = 12d (0xC)
REPEAT_BYTE(12d) = 868082074056920076d (0xC0C0C0C0C0C0C0C)
但是,我仍然无法理解 这个表达式是如何工作的:((~0ul / 0xff) * (x)),我需要一些帮助。
提前非常感谢!
【问题讨论】:
标签: c linux macros linux-kernel kernel