Heim > Artikel > Backend-Entwicklung > Warum führt die Multiplikation ganzzahliger Literale selbst bei einer „long long“-Variablen zu einem Überlauf?
Long Long Integer Overflow in der C-Arithmetik verstehen
Bedenken Sie den folgenden Codeausschnitt:
long long int n = 2000 * 2000 * 2000 * 2000; // overflow
Warum ist das so? Code führt zu einem Überlauf, obwohl eine lange Variable deklariert wurde, die den enthalten soll Ergebnis?
Grund für den Überlauf
Das Problem liegt im Typ der Integer-Literal-Konstanten 2000. Standardmäßig wird Integer-Literalen der kleinste Typ zugewiesen, der sie enthalten kann Wert, ohne kleiner als int zu sein. Da 2000 in einem 32-Bit-Int gespeichert werden kann, werden arithmetische Operationen an diesen Literalen als Int-Operationen ausgeführt.
Typförderung
Obwohl lange Variablen wie n dies können Um größere Werte zu speichern, werden arithmetische Operatoren mit dem größeren der in der Multiplikationsoperation vorhandenen Typen aufgerufen. Allerdings bleibt in diesem Fall der größere Typ int, unabhängig vom Zieltyp.
Implikationen für Überlauf
Das bedeutet, dass das Ergebnis der Multiplikation 2000 * 2000 ist * 2000 * 2000 wird als 32-Bit-Ganzzahl berechnet, die überläuft, weil das Ergebnis den Maximalwert überschreitet, den ein Int erreichen kann halten.
Alternative Ansätze
Um diesen Überlauf zu vermeiden, können Sie die ganzzahligen Literale mithilfe des LL-Suffixes für Literalkonstanten oder des expliziten Umwandlungsoperators ( long long):
long long int n = (long long)2000 * 2000 * 2000 * 2000; // no overflow
Alternativ können Sie die pow-Funktion zur Berechnung des Ergebnisses verwenden und dabei sicherstellen, dass die Berechnung mit durchgeführt wird lange lange Werte:
long long int n = pow(2000, 4); // no overflow
Durch explizites Casting oder die Verwendung der pow-Funktion stellen Sie sicher, dass die Berechnungen mit langen langen Werten durchgeführt werden, wodurch ein Überlauf verhindert wird.
Das obige ist der detaillierte Inhalt vonWarum führt die Multiplikation ganzzahliger Literale selbst bei einer „long long“-Variablen zu einem Überlauf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!