C сдвиг влево на 64 бита не работает

У меня есть этот код на 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 у меня такие странные значения? Я использую gcc 4.6.1 на Ubuntu 10.10 64 бит.

8
задан Frederico Schardong 6 April 2012 в 19:06
поделиться