7

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
4

2 に答える 2

5

uint32_tここでは unsigned int ( )を扱っているため、-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

LIVE CODE

于 2015-05-28T14:27:56.653 に答える
1

uint32_tまず、変数がであるため、符号なしであることを言及する価値があります。次に、よく見てみましょう -upper_bound % upper_bound = (-upper_bound) % upper_bound;。これは、-upper_bound実際には の 2 の補数であることを意味しupper_boundます。とするとupper_bound=10-upper_boundは です0xFFFFFFF6=246。それから-upper_bound % upper_bound = 246%10 = 6。そして、あなたはそれをテストすることができます。

于 2015-05-28T14:30:29.200 に答える