introduction
Le problème est un débordement d'entier. S'il déborde, il revient à la valeur minimale et continue à partir de là. S'il sous-déborde, il revient à la valeur maximale et continue à partir de là. L'image ci-dessous est celle d'un odomètre. J'utilise cela pour expliquer les débordements. C'est un débordement mécanique mais un bon exemple quand même.
Dans un odomètre, le max digit = 9
, allant au-delà du maximum signifie 9 + 1
, ce qui reporte et donne un 0
; Cependant, il n'y a pas de chiffre supérieur à changer en a 1
, donc le compteur se réinitialise à zero
. Vous voyez l'idée - les "débordements d'entiers" viennent à l'esprit maintenant.
Le plus grand littéral décimal de type int est 2147483647 (2 31 -1). Tous les littéraux décimaux de 0 à 2147483647 peuvent apparaître partout où un littéral int peut apparaître, mais le littéral 2147483648 peut apparaître uniquement comme l'opérande de l'opérateur de négation unaire -.
Si une addition entière déborde, alors le résultat est les bits de poids faible de la somme mathématique comme représenté dans un format de complément à deux suffisamment grand. En cas de dépassement de capacité, alors le signe du résultat n'est pas le même que le signe de la somme mathématique des deux valeurs d'opérande.
Ainsi, 2147483647 + 1
déborde et s'enroule autour de -2147483648
. Par conséquent int i=2147483647 + 1
serait débordé, ce qui n'est pas égal à 2147483648
. De plus, vous dites "il imprime toujours 0". Ce n'est pas le cas, car http://ideone.com/WHrQIW . Ci-dessous, ces 8 chiffres montrent le point auquel il pivote et déborde. Il commence alors à imprimer des 0. Aussi, ne soyez pas surpris de la vitesse de calcul, les machines d'aujourd'hui sont rapides.
268435456
536870912
1073741824
-2147483648
0
0
0
0
Pourquoi le débordement d'entier "s'enroule"
PDF original