Heim  >  Artikel  >  Backend-Entwicklung  >  Warum führt die Multiplikation ganzzahliger Literale in einer „long long int'-Zuweisung zu einem Überlauf?

Warum führt die Multiplikation ganzzahliger Literale in einer „long long int'-Zuweisung zu einem Überlauf?

DDD
DDDOriginal
2024-11-08 08:28:01481Durchsuche

Why Does Multiplying Integer Literals in a `long long int` Assignment Lead to Overflow?

Überlauf bei Long-Long-Integer-Zuweisungen: Warum das Multiplizieren von Ganzzahlliteralen fehlschlägt

Im bereitgestellten Codeausschnitt werden drei Long-Long-Integer-Zuweisungen versucht:

long long int n = 2000*2000*2000*2000; // overflow
long long int n = pow(2000,4); // works
long long int n = 16000000000000; // works

Während die dritte Aufgabe erfolgreich ist, warum läuft die erste über, obwohl ein long long int verwendet wird?

Integer-Typen verstehen

Die Der Grund für den Überlauf liegt in der Natur ganzzahliger Typen. Standardmäßig wird Ganzzahlliteralen der kleinste Typ zugewiesen, der ihren Wert darstellen kann, ohne kleiner als int zu sein. Im gegebenen Fall ist 2000 ein int, der auf den meisten Systemen typischerweise 32 Bits belegt.

Multiplikationsregeln

Arithmetische Operatoren, wie z. B. Multiplikation, werden mit aufgerufen größerer der beiden beteiligten Typen, aber nicht kleiner als int. Zum Beispiel:

  • char * char ruft den Operator*(int,int) auf -> int
  • char * int ruft den Operator*(int,int) auf -> int
  • long * int ruft den Operator*(long,long) auf -> long

Allerdings ruft int * int immer noch den Operator*(int,int) auf -> int.

Type Promotion and Overflow

In der Überlaufzuweisung beinhaltet 2000*2000*2000*2000 die Multiplikation von 4 int-Werten, was zu einer Ganzzahl führt, die größer ist als was int halten kann. Obwohl das Endergebnis in einer Variablen vom Typ long long int gespeichert wird, erfolgt die Multiplikation mit ints.

Auflösen des Überlaufs

Um den Überlauf zu vermeiden, kann man Folgendes verwenden Ansätze:

  • Verwenden Sie 2000LL explizit, was ein Long-Long-Int-Literal darstellt.
  • Verwenden Sie pow(2000,4), um die Berechnung als Double durchzuführen, und weisen Sie sie dann dem Long zu long int-Variable.
  • Weisen Sie den großen ganzzahligen Wert, z. B. 16000000000000, direkt der long long int-Variablen zu.

Das obige ist der detaillierte Inhalt vonWarum führt die Multiplikation ganzzahliger Literale in einer „long long int'-Zuweisung 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