[JAVA] Fälle, die aufgrund eines ganzzahligen Überlaufs häufig vergessen werden

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.

1. Voraussetzungen, um die Dinge einfach zu halten

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.)

2. Überlauf, der bei der Multiplikation oft vergessen wird

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.

3. Überlauf, der bei Division (Division) oft vergessen wird

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. ** ** **

3. Zusammenfassung

Recommended Posts

Fälle, die aufgrund eines ganzzahligen Überlaufs häufig vergessen werden
[Von Zeit zu Zeit aktualisiert] Links, die verschuldet sind
[Java] Das Problem, dass hochgeladene Bilder aufgrund des Einflusses des Caches nicht aktualisiert werden