Java の負の int から 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
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
署名された整数を取りつつ。あなたの代わりにInteger.toString(value, 16)
使用する場合は、あなたが望む結果を得るでしょう。
他のヒント
このはいつも私を悩ませていますものです。リテラルの六角とint型を初期化する場合は、0xFFFFFF
までの正の値の全範囲を使用することができます。 0x7FFFFF
より大きいものは本当に負の値になります。これは、あなただけのの場所のビットではなく、その意味を気にビットマスキングおよび他の操作のために非常に便利です。
しかし、あなたは、整数にエラーとして扱われ"0x7FFFFFFF"
よりも大きなものを文字列に変換するにはInteger.parseInt()を使用している場合。そこでは、そのようにしなかった理由を正当な理由は、おそらくですが、それはまだイライラます。
最も単純な回避策はなく、その後intに結果をキャスト)Long.parseLongを(使用することである。
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
あなたは<のhref = "http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Integer.html#parseInt%28java.lang.String,%20int%に必要29" nofollowをnoreferrer = "REL">は負の記号を含む。
私は今、この権利をテストするためのアクセス権を持っていませんが、あなたの代わりにこの値をしようとした場合、私は賭けたい:
Integer min = Integer.MIN_VALUE + 1;
これは、爆撃ではないだろうが、あなたは、ParseInt(min,16)
実行したときに正の数(負ではない)を与えるだろう。
A の文字列のビットは本当にあなたがそれを提供する必要があるので、この文脈で符号を決定するのに十分な情報を持っていません。 、(その+/- F?あなたはビットにそれを変換し、1111を見た場合は、のです。min = "F"
使用する場合を考えるとのあなたはそれがバイトを知っていた、あなたはそれがマイナスだと結論かもしれませんそれは、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」にそれをキャストすることによってバック発見されたようです。 整数が解析されます