Además de las respuestas dadas hasta ahora ...
Hay cuatro valores en total
int i = Integer.MIN_VALUE;
long i = Long.MIN_VALUE;
Integer i = Integer.valueOf(Integer.MIN_VALUE);
Long i = Long.valueOf(Long.MIN_VALUE);
Los valores ajustados se desenvuelven, por lo que también son válidos para esta expresión.
Nota: documentos Math.abs.
public static int abs (int a)
Devuelve el valor absoluto de un valor int. Si el argumento no es negativo, se devuelve el argumento. Si el argumento es negativo, se devuelve la negación del argumento.
Tenga en cuenta que si el argumento es igual al valor de Integer.MIN_VALUE, el valor int representable más negativo, el resultado es el mismo valor, que es negativo.
y
abdominales largos estáticos públicos (a largo)
Devuelve el valor absoluto de un valor largo. Si el argumento no es negativo, se devuelve el argumento. Si el argumento es negativo, se devuelve la negación del argumento.
Tenga en cuenta que si el argumento es igual al valor de Long.MIN_VALUE, el valor largo representable más negativo, el resultado es el mismo valor, que es negativo.
Es sorprendente que Math.abs pueda devolver un número negativo. Esto sucede porque a) no hay valores positivos para -MIN_VALUE en estos casos b) realizando el- cálculo da como resultado un desbordamiento.
Lo que también interesa es por qué Byte.MIN_VALUE, Short.MIN_VALUE no hacen esto. Esto se debe a que -cambia el tipo aint para estos y, por lo tanto, no hay desbordamiento.
Character.MIN_VALUE no tiene ningún problema porque es 0.
Float.MIN_VALUE y Double.MIN_VALUE tienen un significado diferente. Estos son el valor representable más pequeño mayor que cero. Por tanto, tienen valores negativos válidos que no son ellos mismos.