Frage

Ich versuche diesen Code auf dem C++-Compiler von GNU und kann sein Verhalten nicht verstehen:

#include <stdio.h>;

int main()
{
    int  num1 = 1000000000;
    long num2 = 1000000000;
    long long num3;
    //num3 = 100000000000;
    long long num4 = ~0;

    printf("%u %u %u", sizeof(num1), sizeof(num2), sizeof(num3));
    printf("%d %ld %lld %llu", num1, num2, num3, num4);
    return 0;
}

Wenn ich die kommentierte Zeile auskommentiere, wird der Code nicht kompiliert und gibt einen Fehler aus:

Fehler:Die Ganzzahlkonstante ist für einen langen Typ zu groß

Wenn der Code jedoch so kompiliert und ausgeführt wird, erzeugt er Werte, die viel größer als 10000000000 sind.

Warum?

War es hilfreich?

Lösung

Die Buchstaben 100000000000 eine wörtliche Integer-Konstante bilden, aber der Wert ist zu groß für den Typ int. Sie benötigen ein Suffix verwenden, um den Typ des Literals, das heißt zu ändern.

long long num3 = 100000000000LL;

Das Suffix LL macht die wörtliche in Typ long long. C nicht „smart“ genug ist, dies auf der linken Seite von der Art zu schließen, der Typ ist eine Eigenschaft des wörtlichen selbst, nicht der Kontext, in dem sie verwendet wird.

Andere Tipps

Versuchen:

num3 = 100000000000LL;

Und BTW, in C ++ ist dies eine Compiler-Erweiterung, der Standard definiert nicht lange, lange, das ist Teil des C99.

Es hängt davon ab, in welchem ​​Modus Sie kompilieren.long long ist nicht Teil des C++-Standards, sondern wird (normalerweise) nur als Erweiterung unterstützt.Dies wirkt sich auf die Art der Literale aus.Dezimale Ganzzahlliterale ohne Suffix sind immer vom Typ int wenn int groß genug ist um die Zahl darzustellen, sonst lange.Wenn die Zahl sogar für long zu groß ist, ist das Ergebnis durch die Implementierung definiert (wahrscheinlich nur eine Zahl vom Typ long int, die aus Gründen der Abwärtskompatibilität gekürzt wurde).In diesem Fall müssen Sie explizit das Suffix LL verwenden, um die Long-Long-Erweiterung zu aktivieren (auf den meisten Compilern).

Die nächste C++-Version wird offiziell Long Long unterstützen, sodass Sie kein Suffix benötigen, es sei denn, Sie möchten ausdrücklich, dass der Typ des Literals mindestens Long Long ist.Wenn die Zahl nicht in long dargestellt werden kann, versucht der Compiler automatisch, long long zu verwenden, auch ohne LL-Suffix.Ich glaube, dass dies auch das Verhalten von C99 ist.

Ihr Code kompiliert hier in Ordnung (auch mit dieser Linie unkommentiert. Mußte es ändern

num3 = 100000000000000000000;

beginnt die Warnung bekommen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top