문제

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"로 캐스팅하여 표시를 다시 발견합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top