Warum 200020002000*2000 einen Überlauf in C verursacht
Bei Zuweisung des Wertes 20002000 2000*2000 bis Bei einer langen Variablen kommt es zu einem Überlauf. Allerdings führt die Verwendung von pow(2000,4) oder die direkte Zuweisung von 16000000000000 zu einem Long Long Int nicht zu einem Überlauf.
Grund für den Überlauf
Die ganzzahligen Literale 2000 werden standardmäßig implizit in den int-Typ umgewandelt, der normalerweise 32-Bit ist. Arithmetische Operatoren stufen die Argumente immer auf den größeren der vorhandenen Typen hoch, jedoch nicht kleiner als int. Daher wird in diesem Fall die Multiplikation als int*int durchgeführt, was ein int-Ergebnis erzeugt.
Überlauf- vs. Nicht-Überlauf-Szenarien
Im zweiten Szenario Wenn pow(2000,4) verwendet wird, erhöht die pow-Funktion die Argumente auf double und gibt einen double-Wert zurück. Dadurch wird sichergestellt, dass es während der Berechnung nicht zu einem Überlauf kommt.
Im dritten Szenario, in dem 16000000000000 direkt einem Long Long Int zugewiesen wird, ist das Literal groß genug, um implizit in Long Long umgewandelt zu werden. Die Zuweisung wird daher ohne Probleme durchgeführt.
Auflösung
Um einen Überlauf im ersten Szenario zu verhindern, sollten Sie die Integer-Literale mithilfe des LL-Suffixes explizit in long long umwandeln:
long long n = 2000LL*2000LL*2000LL*2000LL;
Das obige ist der detaillierte Inhalt vonWarum verursacht 200020002000 * 2000 einen Überlauf in C, aber nicht pow(2000, 4) oder direkte Zuweisung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!