你必須小心,因爲你的代碼產生溢出,即使你做了unsigned
算術。
可能是你int
變量是數2.147.483.647
溢出後一個32位整數,如果你認爲你計算的最壞的情況下,你必須1.234*10.999.999 + 101 ==> 13.573.998.867
,計算模操作之前,而這將導致你錯誤。
你能做的最好的事情就是用64位數字的這種計算不溢出,與此示例代碼(你會看到不同的結果,即使你的正常積極的)
$ cat pru.c
#include <stdio.h>
#include <stdint.h>
int main()
{
uint64_t i, r=0;
for (i = 0; i < 50; i++) {
r = (1234*r +101) % (11000000);
printf("%llu\n", r);
}
}
這會導致:
$ pru
101
124735
10923091
4094395
3483531
8677355
4856171
8515115
2652011
5581675
1787051
5221035
7757291
2497195
1538731
6794155
1987371
10415915
5239211
8186475
4110251
1049835
8496491
1669995
3773931
4030955
2198571
7036715
4306411
1111275
7313451
4798635
3515691
4362795
4689131
387755
5489771
9377515
10853611
6356075
396651
5467435
3814891
10575595
4284331
6864555
860971
6438315
2880811
1920875
這是正確的,因爲1.234*10.999.999 + 101 ==> 13.573.998.867
永遠不會溢出uint64_t
號(這是你可以有最大的結果),並會產生正確的結果。
不,它不應該是積極的。如果第一個操作數是負數,結果也將是負數。 –
整數溢出:'1234 * 6553739 + 101'最有可能超過'INT_MAX' – UnholySheep
@Don:'long'可能不夠大,'unsigned long long'保證至少有64個值位,這就足夠了。 – chqrlie