Хе-хе, цікаво. Я вважаю, що це, скажімо так, "навмисна помилка".
Основна причина полягає в тому, як пишеться клас Integer. В основному, parseInt "оптимізовано" для позитивних чисел. Коли він аналізує рядок, він будує результат кумулятивно, але заперечує. Потім він перевертає знак кінцевого результату.
Приклад:
66 = 0x42
аналізується як:
4*(-1) = -4
-4 * 16 = -64 (hex 4 parsed)
-64 - 2 = -66 (hex 2 parsed)
return -66 * (-1) = 66
Тепер давайте розглянемо ваш приклад 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.
Змінити (доповнення): для того, щоб parseInt () працював "послідовно" для -Integer.MAX_VALUE <= n <= Integer.MAX_VALUE, їм довелося б реалізувати логіку для "обертання" при досягненні -Integer.MAX_VALUE у кумулятивний результат, починаючи спочатку з максимального кінця цілочисельного діапазону і продовжуючи вниз звідти. Чому вони цього не зробили, треба було б запитати у Джоша Блоха або у того, хто це здійснив. Це може бути просто оптимізація.
Однак
Hex=Integer.toHexString(Integer.MAX_VALUE);
System.out.println(Hex);
System.out.println(Integer.parseInt(Hex.toUpperCase(), 16));
працює просто чудово, саме з цієї причини. У джерелі для Integer ви можете знайти цей коментар.