Introducción
El problema es el desbordamiento de enteros. Si se desborda, vuelve al valor mínimo y continúa desde allí. Si se desborda, vuelve al valor máximo y continúa desde allí. La siguiente imagen es de un odómetro. Utilizo esto para explicar los desbordamientos. Es un desbordamiento mecánico, pero sigue siendo un buen ejemplo.
En un odómetro, el max digit = 9
, yendo más allá de los medios máximos 9 + 1
, que se traslada y da un 0
; Sin embargo, no hay un dígito más alto para cambiar a a 1
, por lo que el contador se restablece zero
. Entiendes la idea: ahora me vienen a la mente los "desbordamientos de enteros".
El literal decimal más grande de tipo int es 2147483647 (2 31 -1). Todos los literales decimales de 0 a 2147483647 pueden aparecer en cualquier lugar donde pueda aparecer un literal int, pero el literal 2147483648 puede aparecer solo como el operando del operador de negación unario -.
Si una suma entera se desborda, entonces el resultado son los bits de orden inferior de la suma matemática representados en algún formato de complemento a dos suficientemente grande. Si se produce un desbordamiento, el signo del resultado no es el mismo que el signo de la suma matemática de los dos valores de operando.
Por lo tanto, se 2147483647 + 1
desborda y se envuelve -2147483648
. Por int i=2147483647 + 1
lo tanto , se desbordaría, lo que no es igual a 2147483648
. Además, dices "siempre imprime 0". No es así, porque http://ideone.com/WHrQIW . A continuación, estos 8 números muestran el punto en el que pivota y se desborda. Luego comienza a imprimir ceros. Además, no se sorprenda de lo rápido que calcula, las máquinas de hoy son rápidas.
268435456
536870912
1073741824
-2147483648
0
0
0
0
Por qué el desbordamiento de enteros "envuelve"
PDF original