Für Programmierer bei der Berechnung in Bezug auf Überlauf, Ich denke ich bin immer vorsichtig, Ich werde kurz die Fälle zusammenfassen, die oft vergessen werden.
Dieser Artikel ist ein biografischer Inhalt, der aus den folgenden Inhalten ausgewählt wurde.
Nehmen wir zur Vereinfachung einen 32-Bit-Integer-Typ mit Vorzeichen an. In Bezug auf den Inhalt dieser Zeit, wenn es sich um einen vorzeichenbehafteten Ganzzahltyp mit fester Genauigkeit handelt, Es sollten auch andere Größen gelten.
In Java C #, C / C ++ Denken Sie an int, Int32, int32 usw. (In C / C ++ wird angenommen, dass der Typ int ein 32-Bit-Verarbeitungssystem ist.)
Das Multiplizieren großer Zahlen kann leicht überlaufen Es ist nicht das Hauptthema, weil ich denke, Sie können es sich sofort vorstellen.
Das Hauptthema sind die folgenden Fälle.
int a = Int32.MinValue;
int b = -1;
int answer = a * b;
int a = Integer.MIN_VALUE;
int b = -1;
int answer = a * b;
int a = INT_MIN;
int b = -1;
int answer = a * b;
a
enthält -2147483648
,
Das Multiplizieren mit "-1" überschreitet "2147483647", was durch eine 32-Bit-Ganzzahl mit Vorzeichen dargestellt werden kann.
In meiner Umgebung ist das Ergebnis jeder "Antwort" -Variablen "-2147483648".
Wenn Sie für C # den Wert auf "Aktiviert" setzen, tritt eine OverFlowException auf.
Wenn der Wert beim Erstellen oder Kompilieren ausgewertet werden kann, Zu diesem Zeitpunkt kann ein Überlauf festgestellt werden.
Wenn in der Ganzzahldivision kein Überlauf auftritt, In einigen Fällen kann es missverstanden werden, aber es kann richtig überlaufen (?!).
int a = Int32.MinValue;
int b = -1;
int answer = a / b;
int a = Integer.MIN_VALUE;
int b = -1;
int answer = a / b;
int a = INT_MIN;
int b = -1;
int answer = a / b;
Ähnlich wie bei der Multiplikation, aber Das Teilen durch "-1" ist dasselbe wie das Multiplizieren mit "-1" Es überschreitet "2147483647", was durch eine 32-Bit-Ganzzahl mit Vorzeichen dargestellt werden kann. In meiner Umgebung in Java lautet das Ergebnis der Variablen "answer" "-2147483648". In C ++ ist eine Ganzzahlüberlaufausnahme aufgetreten. ** Für C # erhalte ich eine OverFlowException, unabhängig davon, ob sie aktiviert ist oder nicht. ** ** **