8

私はCでこのコードを持っています(これは研究専用です):

    char x;
    uint64_t total = 0;

    for(x = 20; x < 30; x++){
        total = (((((1 << x) * x) / 64) + 1) * sizeof(uint64_t));
        printf("%d - %llu\n", x, total);        
    }       

印刷されるもの:

20 - 2621448
21 - 5505032
22 - 11534344
23 - 24117256
24 - 50331656
25 - 104857608
26 - 218103816
27 - 18446744073625665544
28 - 18446744073575333896
29 - 18446744073508225032

なぜ x > 26 でこれらの奇妙な値が得られるのでしょうか? 私は Ubuntu 10.10 64 ビットで gcc 4.6.1 を使用しています。

4

2 に答える 2

23

1int、32 ビットなので、オーバーフロー(1 << 27)*27します。を使用し1ullます。

あなたのコメントに関しては、 if xis a uint64_t、 then1 << xはまだintですが、乗算の場合は にキャストされるuint64_tため、オーバーフローはありません。ただし、 ifx >= 311 << x未定義の動作になります (結果の値を符号付き 32 ビット整数型で表すことができないため)。

于 2012-04-06T19:10:50.247 に答える
0

あなたの問題は、32ビットで計算し、後で64ビット値に割り当てることだと思います

64 による除算は、6 ビットをシフトしないことと同じです。

char x;
uint64_t one = 1;
uint64_t total = 0;

for(x = 20; x < 30; x++){
    total = ((((one << (x - 6)) * x) + 1) * sizeof(uint64_t));
    printf("%d - %llu\n", x, total);        
}

まだコンパイルされていません

于 2012-04-06T19:11:51.473 に答える