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.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)

どうしたの?

4

7 に答える 7

13

これはいつも私を悩ませているものです。0xFFFFFFintを16進リテラルで初期化すると、 ;までの正の値の全範囲を使用できます。それよりも大きいもの0x7FFFFFは実際には負の値になります。これは、ビットの意味ではなく、ビットの位置のみを気にするビットマスキングやその他の操作に非常に便利です。

ただし、Integer.parseInt()を使用して文字列を整数に変換する場合、それより大きい値"0x7FFFFFFF"はエラーとして扱われます。彼らがそのようにしたのにはおそらく正当な理由がありますが、それでもイライラします。

最も簡単な回避策は、代わりにLong.parseLong()を使用してから、結果をintにキャストすることです。

int n = (int)Long.parseLong(s, 16);

もちろん、その数が範囲内にあることが確実な場合にのみ、これを行う必要がありますInteger.MIN_VALUE..Integer.MAX_VALUE

于 2009-05-10T14:05:08.620 に答える
12

Integer.toHexString整数の文字列表現を符号なしの値として返すことが文書化されていますが、符号Integer.parseInt付きのintを取ります。代わりに使用Integer.toString(value, 16)すると、必要なものが得られます。

于 2009-05-10T12:54:28.007 に答える
6

ドキュメントによると、「整数引数の文字列表現を基数16の符号なしtoHexString整数として」返します。

したがって、正しい逆の操作は、おそらくJava8Integer.parseUnsignedIntの一部として導入されたものです。

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));
    }
于 2014-12-06T14:13:09.883 に答える
2

これを試して:

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
于 2009-05-10T13:58:19.070 に答える
1

負の符号を含める必要があります。

現在、これをテストするためのアクセス権はありませんが、代わりにこの値を試してみた場合は間違いありません。

Integer min = Integer.MIN_VALUE + 1;

それは爆撃しませんが、あなたが走ったときにあなたに正の数(負ではない)を与えるでしょうParseInt(min,16)

ビットの文字列には、このコンテキストで符号を判別するための十分な情報が実際にはないため、それを提供する必要があります。(使用する場合を考えてみてくださいmin = "F"。それは+/- Fですか?ビットに変換して1111を見、それがバイトであることがわかっている場合、それは負であると結論付けるかもしれませんが、それは多くの場合です。

于 2009-05-10T12:20:12.703 に答える
0

これは私にとってはうまくいくようです:

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));
}
}

整数は、そのような大きな正の数を処理する「signed long」として解析され、「int」にキャストすることによって符号が検出されます。

于 2014-11-27T11:25:55.780 に答える
0

Integer.parseInt()入力として符号付き整数を取ります。これは、入力が「7FFFFFFF」と「-80000000」の間にある必要があることを意味します。「80000000」の前の負の符号に注意してください。あなたが欲しいのはですInteger.parseInt("-80000000", 16)。マイナス記号なしで80000000を使用すると、Javaはそれを正の数として解釈し、intの最大の正の整数が0x7FFFFFFFであるため、例外をスローします。

于 2022-01-27T19:56:29.180 に答える