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.