Jeje, curioso. Creo que esto es un "error intentianal", por así decirlo.
El motivo subyacente es cómo se escribe la clase Integer. Básicamente, parseInt está "optimizado" para números positivos. Cuando analiza la cadena, construye el resultado de forma acumulativa, pero negada. Luego, voltea el signo del resultado final.
Ejemplo:
66 = 0x42
analizada como:
4*(-1) = -4
-4 * 16 = -64 (hex 4 parsed)
-64 - 2 = -66 (hex 2 parsed)
return -66 * (-1) = 66
Ahora, vamos a ver el ejemplo FFFF8000
16*(-1) = -16 (first F parsed)
-16*16 = -256
-256 - 16 = -272 (second F parsed)
-272 * 16 = -4352
-4352 - 16 = -4368 (third F parsed)
-4352 * 16 = -69888
-69888 - 16 = -69904 (forth F parsed)
-69904 * 16 = -1118464
-1118464 - 8 = -1118472 (8 parsed)
-1118464 * 16 = -17895552
-17895552 - 0 = -17895552 (first 0 parsed)
Here it blows up since -17895552 < -Integer.MAX_VALUE/16 (-134217728).
Attempting to execute the next logical step in the chain (-17895552 * 16)
would cause an integer overflow error.
Editar (adición): con el fin para el parseInt() para trabajar "consistentemente" para -Integer.MAX_VALUE < = n < = Integer.MAX_VALUE, tendrían que implementar lógica para "girar" cuando se llega a -Integer.MAX_VALUE en el resultado acumulado, comenzando de nuevo en el extremo máximo del rango entero y continuando hacia abajo desde allí. Por qué no lo hicieron, uno tendría que preguntarle a Josh Bloch o quién lo implementó en primer lugar. Puede ser solo una optimización.
Sin embargo,
Hex=Integer.toHexString(Integer.MAX_VALUE);
System.out.println(Hex);
System.out.println(Integer.parseInt(Hex.toUpperCase(), 16));
funciona bien, precisamente por esta razón. En el origen de Integer puede encontrar este comentario.
// Accumulating negatively avoids surprises near MAX_VALUE
posible du plicate de [Java negativo int a hex y la parte posterior falla] (http: // stackoverflow.com/questions/845230/java-negative-int-to-hex-and-back-failed) –
Solo una sugerencia: como nombres de variables de convención comienzan con un carácter minúsculo: 'int firstAttempt = 5;' – Simulant