Java Negative Int to Hex 및 Back이 실패합니다
문제
public class Main3 {
public static void main(String[] args) {
Integer min = Integer.MIN_VALUE;
String minHex = Integer.toHexString(Integer.MIN_VALUE);
System.out.println(min + " " + minHex);
System.out.println(Integer.parseInt(minHex, 16));
}
}
주어진
-2147483648 80000000
Exception in thread "main" java.lang.NumberFormatException: For input string: "80000000"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:459)
at Main3.main(Main3.java:7)
무슨 일이야?
해결책
그것은 문서화되어 있습니다 Integer.toHexString
정수의 문자열 표현을 서명되지 않은 값으로 반환합니다. Integer.parseInt
서명 된 int를 취합니다. 사용하는 경우 Integer.toString(value, 16)
대신 당신은 당신이 원하는 것을 얻을 수 있습니다.
다른 팁
이것은 항상 나를 화나게하는 것입니다. 16 진 문자로 int를 초기화하면 최대의 양수 값의 전체 범위를 사용할 수 있습니다. 0xFFFFFF
; 보다 큰 것 0x7FFFFF
실제로 부정적인 가치가 될 것입니다. 이것은 비트 마스킹 및 기타 작업에만 관심이 있습니다. 위치 그들의 의미가 아니라 비트의.
그러나 integer.parseint ()를 사용하여 문자열을 정수로 변환하는 경우 "0x7FFFFFFF"
오류로 취급됩니다. 그들이 그렇게 한 이유가있을 것입니다. 그러나 여전히 실망 스럽습니다.
가장 간단한 해결 방법은 long.parselong ()을 대신 사용한 다음 결과를 int에 캐스팅하는 것입니다.
int n = (int)Long.parseLong(s, 16);
물론, 당신은 그 숫자가 범위에있을 것이라고 확신하는 경우에만 그렇게해야합니다. Integer.MIN_VALUE..Integer.MAX_VALUE
.
문서에 따르면 toHexString
보고 "정수 인수의 문자열 표현은 서명되지 않았습니다 기지 16의 정수. "
따라서 올바른 리버스 작동은 아마도일 것입니다 Integer.parseUnsignedInt
Java 8의 일부로 도입되었습니다.
public class Main3 {
public static void main(String[] args) {
Integer min = Integer.MIN_VALUE;
String minHex = Integer.toHexString(Integer.MIN_VALUE);
System.out.println(min + " " + minHex);
System.out.println(Integer.parseUnsignedInt(minHex, 16));
}
이 시도:
public class Main3 {
public static void main(String[] args) {
Integer min = Integer.MIN_VALUE;
String minHex = Integer.toHexString(Integer.MIN_VALUE);
System.out.println(min + " " + minHex);
System.out.println(Integer.parseInt( "-" + minHex, 16));
}
}
이것을 얻으려면 :
-2147483648 80000000
-2147483648
당신은 필요합니다 부정적인 것을 포함하십시오 징후.
지금 당장 테스트 할 액세스 권한이 없지만 대신이 값을 시도하면 내기를 걸었습니다.
Integer min = Integer.MIN_VALUE + 1;
폭탄은 아니지만, 당신이 달렸을 때 당신에게 양수 (음수가 아닌)를 줄 것입니다. ParseInt(min,16)
.
ㅏ 끈 비트의 비트에는이 상황에서 사인을 결정하기에 충분한 정보가 없으므로 제공해야합니다. (사용하는 경우를 고려하십시오 min = "F"
. 그게 +/- f인가요? 비트로 변환하고 1111을 보았다면 그리고 당신은 그것이 바이트라는 것을 알았고, 그것이 부정적이라고 결론을 내릴 수도 있지만, 그것은 많은 IFS입니다.
이것은 나에게 효과가있는 것 같습니다.
public class Main3 {
public static void main(String[] args) {
Integer min = Integer.MIN_VALUE;
String minHex = Integer.toHexString(Integer.MIN_VALUE);
System.out.println(min + " " + minHex);
System.out.println((int)Long.parseLong(minHex, 16));
}
}
정수는 그러한 큰 양수를 다루는 "서명 된 긴"으로 구문 분석되며 "int"로 캐스팅하여 표시를 다시 발견합니다.