Java Multiple Zwei Zahlen haben ein Problem mit negativen Zahlen [doppelt]
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
Der maximale positive Wert, den eine int
Dose halten kann, ist 2147483647
jenseits 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 -2147483648
mit multipliziert wurde -1
, wird es, 2147483648
aber eine int
Variable kann nicht so viel großen positiven Wert halten; es beginnt also am negativen Ende (dh Integer.MIN_VALUE
).
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.