Was ist das Argument für printf, das ein langes Format formatiert?

Antworten:

634

Setzen Sie einen l(Kleinbuchstaben L) direkt vor den Bezeichner.

unsigned long n;
long m;

printf("%lu %ld", n, m);
Postfuturist
quelle
14
printf("%ld", ULONG_MAX)gibt den Wert als -1 aus. Sollte lange ohne printf("%lu", ULONG_MAX)Vorzeichen sein, wie unten von @Blorgbeard beschrieben.
Jammus
2
Eigentlich sollten Sie es so ändern %ld, dass es harmonischer mit der OP-Frage ist.
Dr. Beco
Ja, Dr. Beco; weiter, %llöst nur auswarning: unknown conversion type character 0x20 in format [-Wformat]
Patrizio Bertoni
190

Ich denke du meinst:

unsigned long n;
printf("%lu", n);   // unsigned long

oder

long n;
printf("%ld", n);   // signed long
Blorgbeard ist raus
quelle
73

Auf den meisten Plattformen longund intgleich 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

Dave Dopson
quelle
@MM Ich habe meine Antwort klargestellt, um Verwirrung zu vermeiden.
Dave Dopson
4
Nur zur Verdeutlichung: Es gibt mehr Architekturen als x86 und x64, und auf diesen Architekturen haben char, short, int, long und long long unterschiedliche Bedeutungen. Beispielsweise könnte eine 32-Bit-MCU mit 16-Bit-Speicherausrichtung Folgendes verwenden: char = short = int = 16 bit; lang = 32 Bit; lang lang = 64 Bit
AndresR
1
@AndresR - absolut, und es ist sehr wichtig für Leute, die Embedded-Programmierung betreiben (ich habe einmal ein Kernel-Modul für einen Rauchmelder gebaut). Schade um diese armen Seelen, wenn sie versuchen, Code zu verwenden, der nicht für die Portabilität geschrieben wurde.
Dave Dopson
Ich bin mir nicht sicher, ob "die meisten Plattformen eine longGröße von 32 haben" noch wahr ist. ZB bin ich unter Oracle Linux x86_64 / amd64 und mit nvcca longist 8 Bytes.
Ragerdl
"Oh, und natürlich ist es in Windows anders". Gibt es eine plattformübergreifende Lösung?
Aaron Franke
17

Es hängt davon ab, ob das Formatierungszeichen auf unsigned long verweist "%lu". Wenn Sie sich auf lange signiert beziehen, lautet das Formatierungszeichen "%ld".

Krato
quelle
12

Wenn Sie so drucken möchten, unsigned long longwie 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).

Dolan Antenucci
quelle
0

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.

Andrew O'Reilly
quelle
Ihre Antwort sollte ein Kommentar sein und keine Antwort für sich.
Jaime Hablutzel