模运算符vs零(re:arc4random_均匀源)
发现自己在看arc4random_统一源() 我的问题涉及以下几行(评论是他们的原始评论): 现在,我不是数学天才,但肯定-N%N永远等于零。那为什么不直接写呢模运算符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
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