Heim  >  Artikel  >  Backend-Entwicklung  >  Warum führt die Multiplikation ganzzahliger Literale selbst bei einer „long long“-Variablen zu einem Überlauf?

Warum führt die Multiplikation ganzzahliger Literale selbst bei einer „long long“-Variablen zu einem Überlauf?

Barbara Streisand
Barbara StreisandOriginal
2024-11-10 19:04:03825Durchsuche

Why Does Multiplying Integer Literals Result in Overflow Even with a `long long` Variable?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn