Das printf
Die Funktion nimmt einen Argumenttyp an, z %d
oder %i
Für ein signed int
. Allerdings sehe ich nichts für a long
Wert.
Was ist das Argument für printf, das ein long formatiert?
Thomas Owens
Postfuturist
Setzen Sie ein l
(Kleinbuchstabe L) direkt vor dem Bezeichner.
unsigned long n;
long m;
printf("%lu %ld", n, m);
-
printf("%ld", ULONG_MAX)
gibt den Wert als -1 aus. Sollte seinprintf("%lu", ULONG_MAX)
für unsigned long wie unten von @Blorgbeard beschrieben.– Jammus
12. November 2011 um 16:03 Uhr
-
Eigentlich müsste man es ändern
%ld
um mit der OP-Frage harmonischer zu sein.– DrBeco
21. Juni 2015 um 5:28 Uhr
-
Ja, Dr. Beco; weiter, nur
%l
löst auswarning: unknown conversion type character 0x20 in format [-Wformat]
– Patrizio Bertoni
29. Juli 2015 um 10:53 Uhr
Blorgbart
Ich denke du meinst:
unsigned long n;
printf("%lu", n); // unsigned long
oder
long n;
printf("%ld", n); // signed long
David Dopson
Auf den meisten Plattformen long
und int
sind gleich groß (32 Bit). Dennoch 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 a long long
:
long long n;
unsigned long long un;
printf("%lld", n); // signed
printf("%llu", un); // unsigned
Oh, und natürlich ist es unter Windows anders:
printf("%l64d", n); // signed
printf("%l64u", un); // unsigned
Wenn ich 64-Bit-Werte drucke, finde ich es häufig hilfreich, sie in Hex zu drucken (normalerweise sind es bei so großen Zahlen Zeiger oder Bitfelder).
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 standardmäßige int-Größe der Plattform, normalerweise 32 Bit. “lang” ist normalerweise die gleiche Größe. Sie haben jedoch auf älteren Plattformen (und modernen eingebetteten Plattformen!) eine andere Portabilitätssemantik. “long long” ist eine 64-Bit-Zahl und normalerweise das, was die Leute verwenden wollten, es sei denn, sie wussten wirklich, was sie taten, um ein Stück tragbaren X-Plattform-Code zu bearbeiten. 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 wahnsinnige Portabilitätsprobleme verursacht. Selbst dies ist natürlich eine Vereinfachung der geheimnisvollen und geschichtsträchtigen Wahrheit. Sehen wiki:Ganzzahl
-
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 ein 32-Bit-MCU mit 16-Bit-Speicherausrichtung verwenden: char=short=int=16 bit; lang=32 Bit; lang lang = 64 Bit
– AndresR
6. September 2016 um 19:19 Uhr
-
@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.
– David Dopson
7. September 2016 um 19:44 Uhr
-
Ich bin mir nicht sicher, ob “die meisten Plattformen eine
long
das ist von Größe 32″ ist immer noch wahr. Ich bin zB auf Oracle Linux x86_64/amd64, und mitnvcc
along
ist 8 Byte.– Interessent333
17. Juni 2019 um 18:02 Uhr
-
“Oh, und natürlich ist es in Windows anders”. Gibt es eine plattformübergreifende Lösung?
– Aaron Franke
13. Mai 2020 um 9:05 Uhr
-
@interestedparty333 Ja, ich bin mir zu> 95% sicher, dass dies unter Linux der Fall ist
long
hat dieselbe Größe wie die Wort-/Zeigergröße (also 32 Bit unter 32-Bit-Linux und 64 Bit unter 64-Bit-Linux). Wenn Sie in den Code des Linux-Kernels oder in Linux-Treiber schauen, speichern sie normalerweise Zeiger darinlong
oderunsigned long
Variablen. Tatsächlich musste vor ein paar Wochen ein Kollege von mir, der Code von Windows auf Linux portiert hat, alle unsere ändernlong
s zuuint32_t
weil wir sie beim Entwickeln unter Windows ständig missbrauchen würden.– AnthonyD973
19. Februar 2021 um 22:21 Uhr
Es hängt davon ab, ob Sie sich auf unsigned long beziehen, das Formatierungszeichen ist "%lu"
. Wenn Sie sich auf signiert lang beziehen, ist das Formatierungszeichen "%ld"
.
Rob Walker
%ld
sehen printf
Referenz auf cplusplus.com
Dolan Antenucci
Falls Sie drucken möchten unsigned long long
wie ich war, verwenden Sie:
unsigned long long n;
printf("%llu", n);
Für alle anderen Kombinationen verwendest du glaube ich die Tabelle aus das printf-Handbuchnehmen Sie die Zeile und dann die Spaltenbezeichnung für den Typ, den Sie drucken möchten (wie ich es mit printf("%llu", n)
Oben).
Andrew O’Reilly
Ich denke, um diese Frage endgültig zu beantworten, müssten Sie den Namen und die Version des Compilers kennen, die Sie verwenden, und die Plattform (CPU-Typ, Betriebssystem usw.), für die kompiliert wird.
-
Ihre Antwort sollte ein Kommentar und keine eigenständige Antwort sein.
– Jaime Hablutzel
29. August 2019 um 5:01 Uhr
Nicht lange verwenden, es ist nicht tragbar. stackoverflow.com/questions/16859500/mmh-who-are-you-priu64
– März
23. November 2019 um 1:02 Uhr