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: Ganzzahlkonstante ist für langen Typ zu groß
Wenn der Code jedoch so kompiliert wird, wie er ist, und ausgeführt wird, werden Werte erzeugt, die viel größer als 10000000000 sind.
Warum?
c++
types
long-integer
sud03r
quelle
quelle
<stdint.h>
und Verwendunguint64_t
. Um einen 64-Bit-Wert anzuzeigen,printf( "%" PRIu64 "\n", val);
<stdint.h>
enthalten,uint64_t a = 0xffffffffffffff; printf( "%" PRIu64 "\n",a ); : error: expected ‘)’ before ‘PRIu64’ printf( "%" PRIu64 "\n",a ); :: warning: spurious trailing ‘%’ in format [-Wformat=] printf( "%" PRIu64 "\n",a );
Antworten:
Die Buchstaben 100000000000 bilden eine Literal-Integer-Konstante, aber der Wert ist für den Typ zu groß
int
. Sie müssen ein Suffix verwenden, um den Typ des Literal zu ändern, d. H.Das Suffix
LL
macht das Literal zum Typlong long
. C ist nicht "klug" genug, um dies aus dem Typ auf der linken Seite zu schließen. Der Typ ist eine Eigenschaft des Literal selbst selbst und nicht des Kontexts, in dem er verwendet wird.quelle
int
,long int
undlong long int
in dem sein Wert dargestellt werden. [C ++ §2.14.2 / 2] Daher muss das Suffix 'LL' jetzt nicht mehr zu einem ganzzahligen Literal hinzugefügt werden, das für andere Typen zu groß ist.Versuchen:
Und übrigens, in C ++ ist dies eine Compiler-Erweiterung, der Standard definiert nicht lange lange, das ist Teil von C99.
quelle
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, andernfalls lang. Wenn die Anzahl für lange Zeit sogar zu groß ist, ist das Ergebnis implementierungsdefiniert (wahrscheinlich nur eine Anzahl vom Typ long int, die aus Gründen der Abwärtskompatibilität abgeschnitten wurde). In diesem Fall müssen Sie das LL-Suffix explizit verwenden, um die lange lange Erweiterung zu aktivieren (bei den meisten Compilern).
Die nächste C ++ - Version wird offiziell long long so unterstützen, dass Sie kein Suffix benötigen, es sei denn, Sie möchten ausdrücklich, dass der Typ des Literals mindestens lang ist. Wenn die Zahl nicht lange dargestellt werden kann, versucht der Compiler automatisch, long long auch ohne LL-Suffix zu verwenden. Ich glaube, das ist auch das Verhalten von C99.
quelle
Ihr Code wird hier gut kompiliert (auch wenn diese Zeile nicht kommentiert ist. Sie musste sie ändern
um die Warnung zu erhalten.
quelle
long
in Übereinstimmung mit dem LP64 ABI dieses Betriebssystems verwendet.