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!