Heim  >  Artikel  >  Backend-Entwicklung  >  Warum verursacht 200020002000 * 2000 einen Überlauf in C, aber nicht pow(2000, 4) oder direkte Zuweisung?

Warum verursacht 200020002000 * 2000 einen Überlauf in C, aber nicht pow(2000, 4) oder direkte Zuweisung?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-09 19:03:02745Durchsuche

Why Does 200020002000 * 2000 Cause Overflow in C   But Not pow(2000, 4) or Direct Assignment?

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!

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