Hehe, neugierig. Ich denke, das ist sozusagen ein "absichtlicher Fehler".
Der zugrunde liegende Grund ist, wie die Integer-Klasse geschrieben wird. Grundsätzlich ist parseInt für positive Zahlen "optimiert". Wenn die Zeichenfolge analysiert wird, wird das Ergebnis kumulativ erstellt, jedoch negiert. Dann dreht es das Vorzeichen des Endergebnisses um.
Beispiel:
66 = 0x42
analysiert wie:
4*(-1) = -4
-4 * 16 = -64 (hex 4 parsed)
-64 - 2 = -66 (hex 2 parsed)
return -66 * (-1) = 66
Schauen wir uns nun Ihr Beispiel FFFF8000 an
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.
Bearbeiten (Hinzufügen): Damit parseInt () für -Integer.MAX_VALUE <= n <= Integer.MAX_VALUE "konsistent" funktioniert, hätte es eine Logik implementieren müssen, um "zu drehen", wenn -Integer.MAX_VALUE in der kumulatives Ergebnis, beginnend am maximalen Ende des ganzzahligen Bereichs und von dort weiter abwärts. Warum sie das nicht taten, musste man Josh Bloch oder denjenigen fragen, der es überhaupt implementiert hatte. Es könnte nur eine Optimierung sein.
Jedoch,
Hex=Integer.toHexString(Integer.MAX_VALUE);
System.out.println(Hex);
System.out.println(Integer.parseInt(Hex.toUpperCase(), 16));
funktioniert gut, nur aus diesem Grund. In der Quelle für Integer finden Sie diesen Kommentar.