Pourquoi un débordement peut-il se produire dans le programme suivant?

void main () { int i; if (i < 0) { i = -i; }; } 

Quelqu’un peut-il m’aider à comprendre pourquoi un débordement peut survenir dans le programme ci-dessus?

Un dépassement peut se produire car la plage de représentation des nombres entiers dans le complément à deux n’est pas symésortingque: la magnitude du plus petit nombre négatif pouvant être représenté est la magnitude du plus grand nombre positif pouvant être représenté, plus un. Par exemple, sur un système 32 bits, les valeurs sont -2,147,483,648 2,147,483,647 et 2,147,483,647 . C’est pourquoi une négation de -2,147,483,648 entraînerait un dépassement de capacité: le résultat de la négation, une valeur positive 2,147,483,648 , ne peut pas être représenté dans un int de même taille.

Notez que l’inverse de ce problème n’est pas vrai: la négation d’un nombre positif n’entraînerait pas un débordement:

 if (i > 0) { i = -i; } // No overflow here 

Votre valeur de “i”, dans la stack, n’est pas définie au démarrage principal. Le code de démarrage qui s’exécute avant l’appel de main () peut laisser n’importe quoi.

Ajoutons à cela ce que Kashif a dit, les entiers négatifs peuvent aller d’une valeur inférieure à celle des entiers non négatifs, car les négatifs n’ont pas besoin de laisser de place pour zéro. Un “1” dans le bit de signe, avec tous les bits restants nuls, provoque un débordement lorsque le signe est inversé.

En 16 bits: -0x8000 == ~ 0x8000 + 1 == 0x7FFF + 1 == 0x8000
// “-” valeur négative == invert + 1 == inversé + 1 == final est identique

Le capot probable de cette valeur est faible, mais présent. Cela ne se produira que si la stack contient le numéro incriminé.

La cause d’un dépassement d’entier survient lorsqu’une opération arithmétique tente de créer une valeur numérique en dehors de la plage pouvant être représentée avec un nombre donné de bits, supérieur ou supérieur à la valeur représentable minimale.

  • Dans votre cas, la variable i n’est pas initialisée. Donc, ce qui va se passer ici, c’est que l’espace mémoire affecté à la variable i de type entier contiendra une valeur résiduelle.
  • Si, par hasard, cette adresse mémoire contient la valeur entière maximale possible qui est -2^31(-2,147,483,648) annulation de cette valeur entraînera un dépassement d’entier.

J’espère que ça aide.