Lit*_*ode 7 c math openbsd cryptography type-bounds
发现自己正在寻找arc4random_uniform源(http://bxr.su/o/lib/libc/crypt/arc4random_uniform.c)
我的问题涉及以下一行(评论是他们的原始评论):
/* 2**32 % x == (2**32 - x) % x */
min = -upper_bound % upper_bound;
现在,我不是数学天才,但肯定-N%N总是等于零.那么为什么不写
min=0
重要的是要注意我们在这里处理unsigned ints(uint32_t),所以-upper_bound不按照你的想法做.实际上2**32 - upper_bound,由于模数环绕,其目的在上面的注释中解释(即获得2**32 % upper_bound没有溢出).
例:
#include <stdio.h>
#include <stdint.h>
int main()
{
    uint32_t upper_bound = 42;
    uint32_t min = -upper_bound % upper_bound;
    printf("%u -> %u\n", upper_bound, min);
    return 0;
}
得到:
42 -> 4