Maison >développement back-end >C++ >Pourquoi 200020002000 * 2000 provoque-t-il un débordement en C mais pas pow(2000, 4) ou une affectation directe ?

Pourquoi 200020002000 * 2000 provoque-t-il un débordement en C mais pas pow(2000, 4) ou une affectation directe ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-09 19:03:02777parcourir

Why Does 200020002000 * 2000 Cause Overflow in C   But Not pow(2000, 4) or Direct Assignment?

Pourquoi 200020002000*2000 provoque un débordement en C

Lors de l'attribution de la valeur de 20002000 2000*2000 à un variable long long, un débordement se produit. Cependant, utiliser pow(2000,4) ou attribuer directement 160000000000000 à un long long int n'entraîne pas de débordement.

Raison du débordement

Les littéraux entiers 2000 sont implicitement convertis en type int par défaut, ce qui est généralement 32 bits. Les opérateurs arithmétiques promeuvent toujours les arguments vers le plus grand des types présents, mais pas plus petit que int. Par conséquent, dans ce cas, la multiplication est effectuée comme int*int, ce qui produit un résultat int.

Scénarios de débordement et de non-débordement

Dans le deuxième scénario , où pow(2000,4) est utilisé, la fonction pow favorise le double des arguments et renvoie une valeur double. Cela garantit qu'aucun débordement ne se produit pendant le calcul.

Dans le troisième scénario, où 16000000000000 est directement affecté à un long long int, le littéral est suffisamment grand pour être implicitement converti en long long. L'affectation est donc effectuée sans problème.

Résolution

Pour éviter tout débordement dans le premier scénario, vous devez explicitement convertir les littéraux entiers en long long en utilisant le suffixe LL :

long long n = 2000LL*2000LL*2000LL*2000LL;

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