Java: Warum ist "lang" Anzahl negative?
Habe ich diesen code:
long i = 0;
while (true) {
i += 10*i + 5;
System.out.println(i);
Thread.sleep(100);
}
Warum die long i
negative nach ein paar Drucke? Wenn der Bereich überschritten wird, sollten keine Fehler auftreten?
Suchen
"Wenn der Bereich überschritten wird, sollten keine Fehler auftreten?" Die bit von Spezifikation führt Sie zu dieser Schlussfolgerung?
Sie selbst schreiben: stackoverflow.com/questions/1657834/...
Overflow of long / integer values
"Wenn der Bereich überschritten wird, sollten keine Fehler auftreten?" Die bit von Spezifikation führt Sie zu dieser Schlussfolgerung?
Sie selbst schreiben: stackoverflow.com/questions/1657834/...
InformationsquelleAutor | 2015-11-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Java keinen Fehler ausgibt, wenn Sie eine Reihe nach Ihren maximalen Wert. Wenn Sie möchten, dass dieses Verhalten, könnten Sie die
Math.addExact(long x, long y)
- Methode aus Java 8. Diese Methode wirft eineArithmeticException
wenn Sie übergeben dieLong.MAX_VALUE
.Der Grund, warum Java nicht eine Ausnahme, und Sie erhalten negative zahlen zu tun hat mit der Art und Weise Nummern gespeichert sind. Für eine lange primitiv das erste byte für das Vorzeichen der Zahl (0 -> positiv, 1 -> negativ), während der rest verwendet für den numerischen Wert. Dies bedeutet, dass
Long.MAX_VALUE
welches ist der größte positive Wert wird gespeichert, wie 01111...111 (0, gefolgt von 63 bits 1). Da Sie eine Nummer hinzuzufügen, die aufLong.MAX_VALUE
beginnen Sie erhalten den negativen ganzen zahlen, da das Zeichen-byte-änderungen auf 1. Dies bedeutet, Sie haben einen numerischen überlauf, aber diesen Fehler nicht geworfen, die von Java.InformationsquelleAutor Slimu
Wenn der Betrieb überläuft, die Ergebnisse geht der Wert zurück zum Minimalwert und weiter geht es.
Gibt es keine Ausnahme.
Wenn Ihr code kann overflows können Sie eine
BigInteger
statt.InformationsquelleAutor Davide Lorenzo MARINO
Einen Auszug aus
Math
javadoc:"Die Plattform nutzt unterzeichnet zwei der Ergänzung Ganzzahl-Arithmetik mit int und long primitive Typen. Die Entwickler sollten wählen Sie die primitiven Typ, um sicherzustellen, dass die arithmetischen Operationen konsequent zu produzieren korrekte Ergebnisse, die in einigen Fällen bedeutet, dass die Operationen werden nicht über den Bereich der Werte von der Berechnung aus. Die beste Praxis ist die Wahl der primitiven Art und Algorithmus, um zu vermeiden, überlauf."
Für Java 8:
"In Fällen, In denen die Größe ist vom Datentyp int oder long und overflow-Fehler müssen erkannt werden, die Methoden addExact, subtractExact, multiplyExact, und toIntExact werfen eine ArithmeticException, wenn die Ergebnisse überlauf. Für andere Rechenoperationen wie dividieren, absolute Wert, Inkrement, Dekrement, und die negation overflow tritt nur mit einer bestimmten minimalen oder maximalen Wert und sollte überprüft werden, das minimum oder maximum als angemessen"
InformationsquelleAutor Rafael Membrives