Die printf
Funktion nimmt einen Argumenttyp an, z. B. %d
oder %i
für a signed int
. Für einen long
Wert sehe ich jedoch nichts .
Die printf
Funktion nimmt einen Argumenttyp an, z. B. %d
oder %i
für a signed int
. Für einen long
Wert sehe ich jedoch nichts .
Antworten:
Setzen Sie einen l
(Kleinbuchstaben L) direkt vor den Bezeichner.
unsigned long n;
long m;
printf("%lu %ld", n, m);
printf("%ld", ULONG_MAX)
gibt den Wert als -1 aus. Sollte lange ohne printf("%lu", ULONG_MAX)
Vorzeichen sein, wie unten von @Blorgbeard beschrieben.
%ld
, dass es harmonischer mit der OP-Frage ist.
%l
löst nur auswarning: unknown conversion type character 0x20 in format [-Wformat]
Ich denke du meinst:
unsigned long n;
printf("%lu", n); // unsigned long
oder
long n;
printf("%ld", n); // signed long
Auf den meisten Plattformen long
und int
gleich groß (32 Bit). Trotzdem hat es einen eigenen Formatbezeichner:
long n;
unsigned long un;
printf("%ld", n); // signed
printf("%lu", un); // unsigned
Für 64 Bit möchten Sie Folgendes long long
:
long long n;
unsigned long long un;
printf("%lld", n); // signed
printf("%llu", un); // unsigned
Oh, und natürlich ist es in Windows anders:
printf("%l64d", n); // signed
printf("%l64u", un); // unsigned
Wenn ich 64-Bit-Werte drucke, finde ich es häufig hilfreich, sie hexadezimal zu drucken (normalerweise mit so großen Zahlen, dass es sich um Zeiger oder Bitfelder handelt).
unsigned long long n;
printf("0x%016llX", n); // "0x" followed by "0-padded", "16 char wide", "long long", "HEX with 0-9A-F"
wird drucken:
0x00000000DEADBEEF
Übrigens bedeutet "lang" nicht mehr so viel (auf Mainstream x64). "int" ist die Standardgröße der Plattform, normalerweise 32 Bit. "lang" ist normalerweise gleich groß. Sie haben jedoch unterschiedliche Portabilitätssemantiken auf älteren Plattformen (und modernen eingebetteten Plattformen!). "long long" ist eine 64-Bit-Zahl und normalerweise das, was die Leute verwenden wollten, es sei denn, sie wussten wirklich, was sie beim Bearbeiten eines tragbaren X-Plattform-Codes taten. Selbst dann hätten sie wahrscheinlich stattdessen ein Makro verwendet, um die semantische Bedeutung des Typs zu erfassen (z. B. uint64_t).
char c; // 8 bits
short s; // 16 bits
int i; // 32 bits (on modern platforms)
long l; // 32 bits
long long ll; // 64 bits
Früher war "int" 16 Bit. Sie würden denken, es wären jetzt 64 Bit, aber nein, das hätte verrückte Portabilitätsprobleme verursacht. Selbst dies ist natürlich eine Vereinfachung der arkanen und geschichtsträchtigen Wahrheit. Siehe Wiki: Integer
long
Größe von 32 haben" noch wahr ist. ZB bin ich unter Oracle Linux x86_64 / amd64 und mit nvcc
a long
ist 8 Bytes.
%ld
siehe printf
Referenz auf cplusplus.com
Wenn Sie so drucken möchten, unsigned long long
wie ich es war, verwenden Sie:
unsigned long long n;
printf("%llu", n);
Ich glaube, Sie verwenden für alle anderen Kombinationen die Tabelle aus dem printf-Handbuch , indem Sie die Zeilen- und dann die Spaltenbezeichnung für den Typ verwenden, den Sie drucken möchten (wie printf("%llu", n)
oben beschrieben).
Um diese Frage endgültig zu beantworten, müssen Sie den Namen und die Version des Compilers, die Sie verwenden, und die Plattform (CPU-Typ, Betriebssystem usw.) kennen, für die er kompiliert wird.