Échec gauche sur 64 bits

J’ai ce code en C (c’est pour l’étude seulement):

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

Qu’est-ce qui est imprimé:

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

Pourquoi à x> 26 ai-je ces valeurs étranges? Je suis sur gcc 4.6.1 sur Ubuntu 10.10 64 bits.

Parce que 1 est un int , 32 bits, donc (1 << 27)*27 débordements. Utilisez 1ull .

En ce qui concerne votre commentaire, si x est un uint64_t , alors 1 << x est toujours un int , mais pour la multiplication, il sera uint64_t en uint64_t , ce qui uint64_t tout débordement. Cependant, si x >= 31 , 1 << x serait un comportement indéfini (car la valeur résultante ne peut pas être représentée par un type entier signé sur 32 bits).

Je suppose que votre problème est que vous calculez en 32 bits et que vous l’atsortingbuez ultérieurement à une valeur de 64 bits.

la division par 64 est la même chose que ne pas décaler 6 bits

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

pas encore compilé