如何理解C中的以下代码?

时间:2016-06-23 22:33:45

标签: c

我使用的是PCG随机数生成包,无法理解以下代码。

time(NULL) ^ (intptr_t)&printf

是生成随机化种子的函数的参数:

void pcg32_srandom(uint64_t seed, uint64_t seq)

在main函数中,它将按如下方式使用:

 pcg32_srandom(time(NULL) ^ (intptr_t)&printf, 54u);
BTW我也想问为什么" 54u"应该这样写吗?

2 个答案:

答案 0 :(得分:2)

我不确定您对随机数生成器了解多少,但通常通过向其传递一个称为“种子”的数字来初始化随机数生成器。在这种情况下,种子被选择为time function XORed返回的时间与printf函数的地址。我认为这不是一个非常好的随机种子,我不相信任何重要的加密任务。

在C中,当你编写54u时,它告诉编译器你正在写一个无符号数。您发布的代码中实际上并不需要u

答案 1 :(得分:2)

让我们分解......

/* original: pcg32_srandom(time(NULL) ^ (intptr_t)&printf, 54u); */
uint64_t a = time(NULL);
uint64_t b = (intptr_t)&printf;
uint64_t c = a ^ b;
uint64_t d = 54u;
printf("a=%llx\n", (unsigned long long) a); /* no guessing about length */ 
printf("b=%llx\n", (unsigned long long) b); /* (thank you @chux) */
printf("c=%llx\n", (unsigned long long) c);
printf("d=%llx\n", (unsigned long long) d);
pcg32_srandom( a ^ b, d);

所以... ^是按位 xor 运算符(编辑:我最初编写)。 添加printf应该可以帮助您跟踪代码正在执行的操作。 显然,代码与时俱进 printf函数的地址(这很聪明,我还没见过 那之前)。

54u上的可能是原作者谨慎的。 在进行位操作时,通常不需要带符号的数字。 这有一些背景:http://soundsoftware.ac.uk/c-pitfall-unsigned

我们可以在这里看到pcg32_srandom()的API:    http://www.pcg-random.org/using-pcg-c-basic.html

and these variants for the global RNG:
   void pcg32_srandom(uint64_t initstate, uint64_t initseq)
   uint32_t pcg32_random()
   uint32_t pcg32_boundedrand(uint32_t bound)

所以看起来他们正试图想出一个种子 随机数生成器“initstate”,由于某种原因, 想用54u作为“initseq”。