Introdução
O problema é o estouro de inteiro. Se transbordar, ele volta ao valor mínimo e continua a partir daí. Se for insuficiente, ele voltará ao valor máximo e continuará a partir daí. A imagem abaixo é de um odômetro. Eu uso isso para explicar transbordamentos. É um estouro mecânico, mas ainda é um bom exemplo.
Em um odômetro, o max digit = 9
, portanto, indo além dos meios máximos 9 + 1
, que transporta e dá um 0
; No entanto, não há dígito superior para alterar para a 1
, portanto, o contador é redefinido para zero
. Você começa a idéia - "estouro de inteiros" vêm à mente agora.
O maior literal decimal do tipo int é 2147483647 (2 31 -1). Todos os literais decimais de 0 a 2147483647 podem aparecer em qualquer lugar em que um literal int possa aparecer, mas o literal 2147483648 pode aparecer apenas como o operando do operador de negação unário -.
Se uma adição inteira estourar, o resultado serão os bits de ordem inferior da soma matemática representada em algum formato de complemento de dois suficientemente grande. Se ocorrer estouro, o sinal do resultado não é o mesmo que o sinal da soma matemática dos dois valores do operando.
Assim, 2147483647 + 1
transborda e envolve -2147483648
. Conseqüentemente, int i=2147483647 + 1
seria transbordado, o que não é igual a 2147483648
. Além disso, você diz "sempre imprime 0". Não é assim, porque http://ideone.com/WHrQIW . Abaixo, esses 8 números mostram o ponto em que ele gira e transborda. Em seguida, começa a imprimir 0s. Além disso, não se surpreenda com o quão rápido ele calcula, as máquinas de hoje são rápidas.
268435456
536870912
1073741824
-2147483648
0
0
0
0
Por que o estouro de inteiro "envolve"
PDF original