C lewe przesunięcie na 64 bitach kończy się niepowodzeniem

Mam ten kod w C (tylko do nauki):

<code>    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);        
    }       
</code>

Co jest drukowane:

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

Dlaczego w x> 26 mam te dziwne wartości? Jestem w gcc 4.6.1 na Ubuntu 10.10 64 bitach.

questionAnswers(2)

yourAnswerToTheQuestion