Maison  >  Article  >  développement back-end  >  Pourquoi la multiplication de littéraux entiers entraîne-t-elle un débordement même avec une variable « long long » ?

Pourquoi la multiplication de littéraux entiers entraîne-t-elle un débordement même avec une variable « long long » ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-10 19:04:03828parcourir

Why Does Multiplying Integer Literals Result in Overflow Even with a `long long` Variable?

Comprendre le débordement d'entiers longs et longs en arithmétique C

Considérez l'extrait de code suivant :

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

Pourquoi cela code entraîne un débordement, malgré la déclaration d'une variable long long pour contenir le résultat ?

Raison du débordement

Le problème réside dans le type des constantes littérales entières 2000. Par défaut, les littéraux entiers se voient attribuer le plus petit type pouvant contenir leur valeur sans être plus petit que int. Puisque 2000 peut être stocké dans un int 32 bits, les opérations arithmétiques sur ces littéraux sont effectuées comme des opérations int.

Promotion de type

Bien que des variables longues et longues comme n puissent stockent des valeurs plus grandes, les opérateurs arithmétiques sont appelés avec le plus grand des types présents dans l'opération de multiplication. Cependant, dans ce cas, le type plus grand reste int, quel que soit le type de destination.

Implications pour le débordement

Cela signifie que le résultat de la multiplication 2000 * 2000 * 2000 * 2000 est calculé comme un entier de 32 bits, qui déborde car le résultat dépasse la valeur maximale qu'un int peut hold.

Approches alternatives

Pour éviter ce débordement, vous pouvez explicitement convertir les littéraux entiers en long long en utilisant le suffixe LL pour les constantes littérales ou l'opérateur de conversion explicite ( long long) :

long long int n = (long long)2000 * 2000 * 2000 * 2000;  // no overflow

Vous pouvez également utiliser la fonction pow pour calculer le résultat, en vous assurant que le calcul est effectué avec des valeurs longues et longues :

long long int n = pow(2000, 4);  // no overflow

En lançant explicitement ou en utilisant la fonction pow, vous vous assurez que les calculs sont effectués avec des valeurs longues et longues, évitant ainsi les débordements.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn