Maison > développement back-end > C++ > Pourquoi la multiplication de littéraux entiers dans une affectation « long long int » entraîne-t-elle un débordement ?

Pourquoi la multiplication de littéraux entiers dans une affectation « long long int » entraîne-t-elle un débordement ?

DDD
Libérer: 2024-11-08 08:28:01
original
506 Les gens l'ont consulté

Why Does Multiplying Integer Literals in a `long long int` Assignment Lead to Overflow?

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
Copier après la connexion

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 :

  • char * char invoquera Operator*(int,int) -> int
  • char * int invoquera l'opérateur*(int,int) -> int
  • long * int invoquera l'opérateur*(long,long) -> long

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 :

  • Utilisez explicitement 2000LL, qui représente un littéral long int.
  • Utilisez pow(2000,4) pour effectuer le calcul en double, puis attribuez-le au long variable long int.
  • Attribuez directement la grande valeur entière, telle que 16000000000000, à la variable long long int.

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal