模运算符vs零(re:arc4random_均匀源)

模运算符vs零(re:arc4random_均匀源),c,math,cryptography,openbsd,type-bounds,C,Math,Cryptography,Openbsd,Type Bounds,发现自己在看arc4random_统一源() 我的问题涉及以下几行(评论是他们的原始评论): 现在,我不是数学天才,但肯定-N%N永远等于零。那为什么不直接写呢 min=0 需要注意的是,我们在这里处理的是无符号整数(uint32\u t),因此-上界不会像您认为的那样。由于模环绕,它实际上是2**32-上界,其目的在上面的注释中解释(即获得2**32%上界,无溢出) 例如: #include <stdio.h> #include <stdint.h> int mai

发现自己在看arc4random_统一源()

我的问题涉及以下几行(评论是他们的原始评论):

现在,我不是数学天才,但肯定-N%N永远等于零。那为什么不直接写呢

min=0

需要注意的是,我们在这里处理的是无符号整数(
uint32\u t
),因此
-上界
不会像您认为的那样。由于模环绕,它实际上是
2**32-上界
,其目的在上面的注释中解释(即获得
2**32%上界
,无溢出)

例如:

#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;
}

首先值得一提的是变量是
uint32\t
,因此没有符号。然后让我们仔细看看:
-上限%上限=(-upper\u-bound)%upper\u-bound。这意味着
-上界
实际上是
上界
的2的补码。假设
上限=10
,则
-上限
0xFFFFFFF6=246
。然后
-上限%upper\u bound=246%10=6
。您可以对其进行测试。

相关:
#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