헤헤, 궁금해. 말하자면 이것은 "의도적 인 버그"라고 생각합니다.
근본적인 이유는 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에 도달 할 때 "회전"하는 논리를 구현해야했습니다. 누적 결과, 정수 범위의 최대 끝에서 시작하여 아래로 계속됩니다. 왜 이렇게하지 않았는지, Josh Bloch 나 처음에 구현 한 사람에게 물어봐야합니다. 단지 최적화 일 수 있습니다.
하나,
Hex=Integer.toHexString(Integer.MAX_VALUE);
System.out.println(Hex);
System.out.println(Integer.parseInt(Hex.toUpperCase(), 16));
이 이유 때문에 잘 작동합니다. Integer의 소스에서이 주석을 찾을 수 있습니다.