Frage

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?

War es hilfreich?

Lösung

Es ist dokumentiert, dass Integer.toHexString eine String-Darstellung der ganzen Zahl als unsigned Wert zurückgibt - während Integer.parseInt ein signiertes int nimmt. Wenn Sie Integer.toString(value, 16) verwenden stattdessen werden Sie bekommen, was Sie wollen.

Andere Tipps

Das ist etwas, das mich immer geärgert. Wenn Sie einen int mit einem Hex-wörtlichen initialisieren, können Sie das gesamte Spektrum der positiven Werte verwenden bis zu 0xFFFFFF; etwas größer als 0x7FFFFF wird wirklich ein negativer Wert sein. Dies ist sehr praktisch für Bit Maskierung und andere Operationen, bei denen man nur über die Stellen kümmert des Bits, nicht ihre Bedeutung.

Aber wenn Sie Integer.parseInt () verwenden, um eine Zeichenfolge zu einer ganzen Zahl zu konvertieren, etwas größer als "0x7FFFFFFF" wird als Fehler behandelt. Wahrscheinlich gibt es einen guten Grund, warum sie es so taten, aber es ist immer noch frustrierend.

Die einfachste Abhilfe ist Long.parseLong () stattdessen zu verwenden, dann werfen Sie das Ergebnis in int.

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

Natürlich sollten Sie nur tun, wenn Sie sicher sind, dass die Zahl im Bereich Integer.MIN_VALUE..Integer.MAX_VALUE sein wird.

, um die in der Dokumentation nach, toHexString kehrt "ein String-Darstellung der ganzen Zahl als Argument unsigned integer in Basis 16"

So ist der richtige Rückwärtsbetrieb ist wahrscheinlich Integer.parseUnsignedInt , die als Teil von Java 8 eingeführt wurden:

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

Versuchen Sie folgendes:

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

}

diese bekommen:

-2147483648 80000000
-2147483648

Sie müssen umfasst ein negatives Zeichen.

Ich habe keinen Zugriff dieses Recht jetzt zu testen, aber ich wette, wenn Sie diesen Wert versuchen stattdessen:

Integer min = Integer.MIN_VALUE + 1;

Es wäre nicht bombardieren, aber würden Sie eine positive Zahl (nicht negativ) geben, wenn Sie ParseInt(min,16) lief.

A string von Bits hat nicht wirklich genug Informationen Zeichen in diesem Zusammenhang zu bestimmen, so dass Sie es zur Verfügung stellen müssen. (Man denke an den Fall, dass Sie min = "F" verwenden. Ist das +/- F? Wenn Sie es zu Bits umgewandelt und sah 1111, und Sie wussten, dass es ein Byte war, könnte man schließen, dass es negativ ist, aber das ist viel ifs.

Dies scheint für mich zu arbeiten:

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

Die ganze Zahl wird als „signed long“ analysiert, die so große positive Zahl behandeln und dann wird das Zeichen gefunden zurück durch Gießen Sie es auf „int“.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top