我正在 kernel.h 中查看 /usr/src/linux-headers-3.11-.../include/linux/ 头文件中的代码,我偶然发现了这个宏(第 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;
}

我已经弄清楚它的作用:它在 int0 (包括它们)之间接收一个 255 ,因此任何一字节长的 int ,它都会重复该字节。查看输出时,这很明显(宏的名称除外):
z = 12d (0xC)
REPEAT_BYTE(12d) = 868082074056920076d (0xC0C0C0C0C0C0C0C)

但是,我仍然无法理解 这个表达式是如何工作的: ((~0ul / 0xff) * (x)) ,我可以使用它的一些帮助。

非常感谢!

最佳答案

在 64 位机器上, ~0ul0xffffffffffffffff 。除以 0xff ,你得到 0x0101010101010101 。乘以一个 8 位值,您将得到该 8 位值重复 8 次。

关于c - REPEAT_BYTE(x) 宏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23793948/

10-16 11:40