Java-negative int nach hex und wieder ausfällt
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));
}
}
Gibt
-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)
Whats up?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist dokumentiert, dass
Integer.toHexString
gibt eine string-Darstellung des integer als unsigned-Wert - währendInteger.parseInt
dauert signed int. Wenn SieInteger.toString(value, 16)
stattdessen werden Sie bekommen, was Sie wollen.Dies ist etwas, das immer ärgerte mich. Wenn Sie initialisieren Sie eine int mit einem hex-literal, können Sie die volle Bandbreite an positiven Werten bis zu
0xFFFFFF
; etwas größer als0x7FFFFF
wirklich ein negativer Wert. Dies ist sehr praktisch für die bit-Maskierung und andere Vorgänge, wo Sie nur die Sorge um die Standorten der bits, nicht Ihre Bedeutung.Aber wenn Sie verwenden Sie Integer.parseInt() zum umwandeln eines string in einen integer, etwas größer als
"0x7FFFFFFF"
wird als Fehler behandelt. Es gibt wahrscheinlich einen guten Grund, warum Sie es Taten, die Art und Weise, aber es ist immer noch frustrierend.Die einfachste Lösung ist die Verwendung Lange.parseLong() statt, dann warf Sie das Ergebnis int.
Natürlich sollten Sie das nur tun, wenn Sie sicher sind, dass die Zahl wird im Bereich
Integer.MIN_VALUE..Integer.MAX_VALUE
.Gemäß den in der Dokumentation,
toHexString
gibt "eine string-Darstellung des integer-Arguments als eine unsigned ganze Zahl zur Basis 16. "So der korrekte reverse-Betrieb ist wahrscheinlich
Integer.parseUnsignedInt
, die war eingeführt als Teil von Java 8:Versuchen Sie dies:
}
um dies zu erhalten:
Müssen Sie enthalten negative Zeichen.
Ich keinen Zugriff habe, dies zu testen, gerade jetzt, aber ich Wette, wenn Sie versucht, diesen Wert statt:
Wäre es nicht Bombe, aber würde geben Sie eine positive Zahl (nicht negativ), wenn Sie lief
ParseInt(min,16)
.Einen string der bits nicht wirklich genug info, um zu bestimmen Zeichen in diesem Kontext, so müssen Sie es. (betrachten Sie den Fall, wo Sie
min = "F"
. Ist, dass +/-F? Wenn Sie konvertiert es in Stücke und sah 1111, und Sie wusste, es war ein byte, werden Sie feststellen, dass es negativ ist, aber das ist eine Menge von ifs.Diese scheinen für mich arbeiten :
Den integer geparst wird als "signed long", die mit so großen positiven Zahl und dann das Schild wieder gefunden, indem man es auf "int".