Como jterrace dice, el de Java en tiempo de ejecución se "envoltura' el resultado a la Integer.MIN_VALUE de -2147483648.
Pero eso es matemáticamente incorrecta! La respuesta correcta Matemáticamente es 2147483648. sin embargo, un 'int' no puede tener un valor de 2147483648. Las fronteras 'int' son -2147483648 a 2147483647
¿Por qué no hace una excepción de Java? ¡Buena pregunta! Un objeto Array lo haría.
Pero los autores del lenguaje conocen el alcance de sus tipos primitivos, por lo que utilizan la técnica de "envoltura" para evitar una excepción costosa.
Usted, como desarrollador, debe probar estos límites de tipo. Una prueba simple para incrementar sería
if(x++ == Integer.MIN_VALUE)
//boundary exceeded
Una prueba simple para decremento habría
if(x-- == Integer.MAX_VALUE)
//boundary exceeded
una prueba completa para ambos sería
if(x++ == Integer.MIN_VALUE || x-- == Integer.MAX_VALUE)
//boundary exceeded
[Este PDF] (http://pages.cs.wisc.edu/~willb/cs302/spring-07/why-integer-overflow-cl.pdf) dan una explicación clara de cómo/por qué funciona Sí, la versión atómica hará lo mismo. – TofuBeer