Einführung
Das Problem ist ein ganzzahliger Überlauf. Wenn es überläuft, kehrt es zum Minimalwert zurück und fährt von dort fort. Wenn es unterläuft, kehrt es zum Maximalwert zurück und fährt von dort fort. Das Bild unten zeigt einen Kilometerzähler. Ich benutze dies, um Überläufe zu erklären. Es ist ein mechanischer Überlauf, aber immer noch ein gutes Beispiel.
In einem Kilometerzähler, der max digit = 9
über das Maximum hinausgeht 9 + 1
, überträgt und gibt ein 0
; Es gibt jedoch keine höhere Ziffer, die in a geändert werden kann 1
, sodass der Zähler auf zurückgesetzt wird zero
. Sie haben die Idee - "Integer Overflows" kommen jetzt in den Sinn.
Das größte Dezimalliteral vom Typ int ist 2147483647 (2 31 -1). Alle Dezimalliterale von 0 bis 2147483647 können überall dort erscheinen, wo ein int-Literal erscheinen kann, aber das Literal 2147483648 kann nur als Operand des unären Negationsoperators erscheinen -.
Wenn eine ganzzahlige Addition überläuft, sind das Ergebnis die niederwertigen Bits der mathematischen Summe, wie sie in einem ausreichend großen Zweierkomplementformat dargestellt werden. Wenn ein Überlauf auftritt, stimmt das Vorzeichen des Ergebnisses nicht mit dem Vorzeichen der mathematischen Summe der beiden Operandenwerte überein.
Somit 2147483647 + 1
läuft über und wickelt sich um -2147483648
. Daher int i=2147483647 + 1
wäre übergelaufen, was nicht gleich ist 2147483648
. Außerdem sagen Sie "es wird immer 0 gedruckt". Dies ist nicht der Fall, da http://ideone.com/WHrQIW . Unten zeigen diese 8 Zahlen den Punkt, an dem es schwenkt und überläuft. Es beginnt dann, Nullen zu drucken. Seien Sie auch nicht überrascht, wie schnell es berechnet, die Maschinen von heute sind schnell.
268435456
536870912
1073741824
-2147483648
0
0
0
0
Warum ein ganzzahliger Überlauf "umhüllt"
Original PDF