C izquierda desplazamiento en fallos de 64 bits

Tengo este código en C (es solo para estudio):

<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>

Lo que se imprime:

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

¿Por qué en x> 26 tengo esos valores extraños? Estoy en gcc 4.6.1 en Ubuntu 10.10 64 bits.

Respuestas a la pregunta(2)

Su respuesta a la pregunta