Posteriormente a consultar con especialistas en el tema, programadores de deferentes áreas y maestros dimos con la respuesta al dilema y la compartimos en este post.
Solución:
Porque el entero se desborda. Cuando se desborda, el siguiente valor es Integer.MIN_VALUE
. JLS relevante
Si una suma de enteros se desborda, el resultado son los bits de orden inferior de la suma matemática representados en un 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 los operandos.
El almacenamiento de enteros se desborda y eso no se indica de ninguna manera, como se indica en JSL 3rd Ed.:
Los operadores de enteros incorporados no indican desbordamiento o subdesbordamiento de ninguna manera. Los operadores enteros pueden arrojar un
NullPointerException
si la conversión de unboxing (§5.1.8) de un null se requiere referencia. Aparte de eso, los únicos operadores de enteros que pueden generar una excepción (§11) son el operador de división de enteros/
(§15.17.2) y el operador de resto entero%
(§15.17.3), que arrojan unArithmeticException
si el operando de la derecha es cero y los operadores de incremento y decremento++
(§15.15.1, §15.15.2) y--
(§15.14.3, §15.14.2), que puede arrojar unOutOfMemoryError
si se requiere conversión boxing (§5.1.7) y no hay suficiente memoria disponible para realizar la conversión.
Ejemplo en un almacenamiento de 4 bits:
MAX_INT: 0111 (7)
MIN_INT: 1000 (-8)
MAX_INT + 1:
0111+
0001
----
1000
Debe comprender cómo se representan los valores enteros en forma binaria y cómo funciona la suma binaria. Java usa una representación llamada complemento a dos, en la que el primer bit del número representa su signo. Cada vez que agrega 1 al entero java más grande, que tiene un signo de bit de 0, entonces su signo de bit se convierte en 1 y el número se vuelve negativo.
Este enlace explica con más detalles: http://www.cs.grinnell.edu/~rebelsky/Espresso/Readings/binary.html#integers-in-java
—
La especificación del lenguaje Java trata este comportamiento aquí: http://docs.oracle.com/javase/specs/jls/se6/html/expressions.html#15.18.2
Si una suma de enteros se desborda, el resultado son los bits de orden inferior de la suma matemática representados en un 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 los operandos.
Lo que significa que puede confiar en este comportamiento.