Java Multiple Zwei Zahlen haben ein Problem mit negativen Zahlen [doppelt]

Dec 16 2020

Ich bin vor kurzem mit dem folgenden Problem konfrontiert

 public class Main {
    public static void main(String[] args) throws Exception {
        // Your code here!
        int i = -2147483648;
        int j = i * -1;
        
        System.out.println("j="+j);
    }
}

Ergebnis: -2147483648

Online IDE mit Code: https://paiza.io/projects/e/17lF_6-GltIcyubZv3QoFg?theme=twilight

Aber wie es nach der Logik funktioniert, die ich brauche, um 2147483648 zu erhalten, ist ein Ergebnis, oder? Wie habe ich dann diese negative Zahl bekommen? Es liegt am ganzzahligen Bereich (Integer.MIN_VALUE)? Wie kann ich dieses Problem beheben?

Antworten

1 LiveandLetLive Dec 16 2020 at 03:10

Der maximale positive Wert, den eine intDose halten kann, ist 2147483647jenseits dessen der Wert zum anderen Ende geht (dh er beginnt am negativen Ende). Sie können es anhand der folgenden Demo verstehen:

public class Main {
    public static void main(String[] args) {
        int i = -2147483648;
        int j = i * -1;

        System.out.println("j=" + j);

        System.out.println(Integer.MAX_VALUE);
        System.out.println(Integer.MAX_VALUE + 1);
        System.out.println(Integer.MIN_VALUE);

        // Some more examples for you to understand this concept better
        System.out.println(Integer.MAX_VALUE + 2);
        System.out.println(Integer.MAX_VALUE + 3);
    }
}

Ausgabe:

j=-2147483648
2147483647
-2147483648
-2147483648
-2147483647
-2147483646

Nachdem -2147483648mit multipliziert wurde -1, wird es, 2147483648aber eine intVariable kann nicht so viel großen positiven Wert halten; es beginnt also am negativen Ende (dh Integer.MIN_VALUE).

1 tibetiroka Dec 16 2020 at 03:09

Die Nummer 2147483648 existiert nicht. Der größte Wert eines int ist 2147483647, was 1 kleiner als Ihr erwartetes Ergebnis ist. Die Multiplikation verursacht einen Überlauf, der die Zahl auf den kleinsten negativen Wert zurücksetzt und von dort aus die Berechnung fortsetzt. (Mit anderen Worten: 2147483647 + 1 = -2147483648 (kleinstes Negativ)) Da das Ergebnis nur 1 über dem Maximalwert liegt, ist keine zusätzliche Aktion erforderlich und der minimale Int-Wert wird zurückgegeben.

Wenn Sie dieses Problem beheben möchten, verwenden Sie für Ihre Variablen 'long' anstelle von 'int'. Sie können auch komplexere Klassen wie BigDecimal verwenden oder eine benutzerdefinierte Multiplikationsfunktion für Byte-Arrays schreiben.

Hinweis: Unabhängig davon, welchen numerischen Typ Sie verwenden, können ähnliche Probleme auftreten, solange der zur Darstellung der Zahl verwendete Speicher endlich ist. Obwohl dies unter normalen Umständen selbst für eine 32-Bit-Ganzzahl (int) unwahrscheinlich ist.