150 votes

Pourquoi long long n = 2000*2000*2000*2000 ; débordement?

long long int n = 2000*2000*2000*2000;    // overflow

long long int n = pow(2000,4);            // works
long long int n = 16000000000000;         // works

Pourquoi le premier déborde-t-il (en multipliant les constantes littérales entières à affecter à un long long) ?

Qu'est-ce qu'il y a de différent par rapport au deuxième ou au troisième ?

19voto

Dean Johnson Points 63

La première est une multiplication utilisant des entiers (typiquement 32 bits). Il déborde car ces entiers ne peuvent pas stocker 2000^4 . Le résultat est ensuite converti en long long int .

La seconde appelle la fonction pow qui convertit le premier argument en double et renvoie un double . Le résultat est ensuite converti en long long int . Il n'y a pas de débordement dans ce cas car le calcul est fait sur une valeur double.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X