Maison > Article > développement back-end > Pourquoi la multiplication de littéraux entiers dans une affectation « long long int » entraîne-t-elle un débordement ?
Débordement dans l'affectation Long Long Int : pourquoi la multiplication de littéraux entiers échoue
Dans l'extrait de code fourni, trois affectations d'entiers longs et longs sont tentées :
long long int n = 2000*2000*2000*2000; // overflow long long int n = pow(2000,4); // works long long int n = 16000000000000; // works
Alors que la troisième mission réussit, pourquoi la première déborde-t-elle malgré l'utilisation d'un long long int ?
Comprendre les types entiers
Le la raison du débordement réside dans la nature des types entiers. Par défaut, les littéraux entiers se voient attribuer le plus petit type pouvant représenter leur valeur sans être plus petit que int. Dans le cas donné, 2000 est un entier, qui occupe généralement 32 bits sur la plupart des systèmes.
Règles de multiplication
Les opérateurs arithmétiques, tels que la multiplication, sont invoqués avec le plus grand des deux types impliqués, mais pas plus petit que int. Par exemple :
Cependant, int * int appelle toujours Operator*(int,int) -> int.
Promotion de type et débordement
Dans l'affectation de débordement, 2000*2000*2000*2000 implique de multiplier 4 valeurs int, ce qui donne un entier plus grand que ce que int peut tenir. Bien que le résultat final soit stocké dans une variable long long int, la multiplication se produit avec des entiers.
Résoudre le débordement
Pour éviter le débordement, on peut utiliser ce qui suit approches :
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!