Überlaufende lange lange Multiplikation
Bedenken Sie den folgenden Code:
long long int n = 2000*2000*2000*2000; // overflow
Warum führt dieser Code zu einem Überlauf? wenn ganzzahlige Literalkonstanten multipliziert und das Ergebnis einer langen Variablen zugewiesen werden?
Im Vergleich zu den folgenden, die funktionieren:
long long int n = pow(2000,4); // works long long int n = 16000000000000; // works
Ganzzahlliterale in C haben einen Standardtyp, der von ihrem Wert abhängt . In diesem Fall passt 2000 in eine int-Variable, die normalerweise einen 32-Bit-Typ hat.
Arithmetische Operationen werden mit dem größeren Typ der Operanden ausgeführt, jedoch nicht kleiner als int. Im ersten Fall wird die Multiplikation also als int*int ausgeführt, was zu einem int-Ergebnis führt.
Das Problem entsteht, weil das int-Ergebnis möglicherweise überläuft, der Code jedoch versucht, es in einer langen Variablen zu speichern . C leitet keine Typen basierend auf dem Ziel ab, sodass die Zuweisung den Überlauf nicht verhindert.
Um dieses Problem zu vermeiden, können Sie die ganzzahligen Literale explizit in long long umwandeln, bevor Sie sie multiplizieren:
long long int n = (long long int)2000*2000*2000*2000;
Das obige ist der detaillierte Inhalt vonWarum läuft die Multiplikation ganzzahliger Literalkonstanten über, selbst wenn sie einer „long long'-Variablen zugewiesen wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!