2015-05-28 15 views
6

kendimi arc4random_uniform kaynağına bakarak Bulunan (http://bxr.su/o/lib/libc/crypt/arc4random_uniform.c)Modülü Operatör Zero vs (re: arc4random_uniform kaynağı)

Sorum şu satıra ilgilidir

(yorum orijinal yorumdur) :

/* 2**32 % x == (2**32 - x) % x */ 
min = -upper_bound % upper_bound; 

Şimdi, matematik dehası değilim, ama kesinlikle -N% N her zaman sıfıra eşit olacaktır. Peki neden sadece bu yüzden -upper_bound sen öyle düşündüğün yapmaz,

min=0 
+2

İlgili: http://stackoverflow.com/questions/8026694/c-unary-minus-operator-behavior-with-unsigned-operands – dragosht

cevap

4

Biz burada imzasız ints (uint32_t) ile uğraşıyoruz dikkat etmek önemlidir yazmayın. Aslında, modulo sargısı nedeniyle, sayılı Uluslararası Patent Başvurusu ve bunun amacı, yukarıdaki açıklamada açıklanmıştır (yani, taşma olmadan 2**32 % upper_bound'un elde edilmesi).

Örnek:

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

verir:

42 -> 4 

LIVE CODE

1

Önce böylece imzasız, değişkenler uint32_t olduğunu belirtmekte yarar var. O zaman yakından bakalım: -upper_bound % upper_bound = (-upper_bound) % upper_bound;. Bu, -upper_bound'un aslında 2'nin upper_bound tamamlayıcısı olduğu anlamına gelir. upper_bound=10, sonra -upper_bound'un 0xFFFFFFF6=246 olduğunu varsayalım. Sonra -upper_bound % upper_bound = 246%10 = 6. Ve sen de deneyebilirsin.