Ü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:
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:
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!