lang lang in C / C ++
Ich versuche diesen code in GNU C++ compiler, und bin nicht in der Lage zu verstehen, sein Verhalten:
#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 kommentieren Sie die auskommentierte Zeile, der code kann nicht kompiliert werden, und gibt eine Fehlermeldung:
Fehler: integer-Konstante zu groß für long-Datentyp
Aber, wenn der code kompiliert wird, wie es ist und ausgeführt wird, erzeugt Werte, die viel größer als 10000000000.
Warum?
InformationsquelleAutor der Frage sud03r | 2009-09-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Buchstaben 100000000000 make-up-literal integer-Konstante ist, aber der Wert ist zu groß für den Typ
int
. Sie müssen ein suffix verwenden, ändern Sie den Typ für das literal, d.h.Dem suffix
LL
macht das literal in Typlong long
. C ist nicht "smart" genug, um den Abschluss dieser Typ auf der linken Seite, der Typ ist eine Eigenschaft, die das literal selbst ist, und nicht der Kontext, in dem es verwendet wird.InformationsquelleAutor der Antwort unwind
Versuchen:
Und BTW, auch in C++ dies ist eine compiler-Erweiterung, der standard definiert nicht lange, das ist ein Teil der C99 ist.
InformationsquelleAutor der Antwort Arkaitz Jimenez
Es hängt davon ab, in welchem Modus Sie kompilieren. lange, lange ist nicht Teil der C++ - standard, sondern nur (in der Regel) unterstützt als Erweiterung. Dies wirkt sich auf den Typ des literals. Dezimal-integer-Literale ohne suffix sind immer vom Typ int wenn int ist groß genug repräsentieren die Anzahl, lange nichts anderes. Wenn die Zahl gerade ist zu groß für lange das Ergebnis wird durch die Implementierung festgelegt (wahrscheinlich nur eine Zahl vom Typ long int, der abgeschnitten wurde aus Gründen der Abwärtskompatibilität). In diesem Fall müssen Sie explizit die LL-suffix zu ermöglichen, die lange, lange Verlängerung (in den meisten Compilern).
Den nächsten C++ - version wird offiziell unterstützt lange in einer Weise, die Sie nicht brauchen, ein suffix, sofern Sie nicht explizit wollen, dass die Kraft, die das literal-Typ zu sein, zumindest lange. Wenn die Zahl nicht dargestellt werden kann in lange der compiler automatisch versuchen, die lange auch ohne LL-suffix. Ich glaube, das ist das Verhalten von C99 auch.
InformationsquelleAutor der Antwort sellibitze
Ihren code kompiliert hier einwandfrei (auch mit dieser Zeile das Kommentarzeichen entfernt. hatte zu ändern, um
starten immer die Warnung.
InformationsquelleAutor der Antwort Omry Yadan