Débordement d'entiers : quand la multiplication mène au désastre
En C, il est essentiel de comprendre les tailles et les types d'entiers pour éviter d'éventuels débordements. Examinons l'extrait de code suivant :
long long int n = 2000*2000*2000*2000; // overflow long long int n = pow(2000,4); // works long long int n = 16000000000000; // works
Pourquoi la première ligne entraîne-t-elle un débordement, alors que les deux autres fonctionnent sans problème ?
Le coupable réside dans la façon dont C gère les littéraux entiers et opérations arithmétiques. Par défaut, les littéraux entiers sont du type le plus petit pouvant contenir leur valeur, mais pas plus petit que int. Dans ce cas, 2000 est un entier, généralement un type 32 bits.
Lors de l'exécution d'opérations arithmétiques, le compilateur suit des règles spécifiques basées sur les types d'opérandes. Dans ce scénario, la multiplication se fait avec des entiers, qui sont le plus grand des types impliqués. Cependant, l'affectation n'est pas pertinente car C ne déduit pas les types en fonction de la destination.
Le résultat de la multiplication, qui dépasse la capacité de int, est stocké sous forme int, conduisant à un débordement. C'est pourquoi la première ligne déclenche un débordement, alors que les deux autres ne le font pas.
Pour résoudre ce problème, on peut spécifier explicitement le type de constante utilisée dans la première ligne en ajoutant le suffixe LL (ou ll ). Cela garantit que le littéral est traité comme un long long int, évitant ainsi tout débordement.
En comprenant comment fonctionnent les types entiers et les opérations arithmétiques en C , nous pouvons éviter les pièges potentiels et garantir que notre code gère correctement la manipulation des données.
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!