Was ist der Konvertierungsspezifizierer für printf, der ein long formatiert?

Lesezeit: 6 Minuten

Benutzeravatar von Thomas Owens
Thomas Owens

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.

  • 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

  • @MarcH – ist es auch nicht int tragbar. Historisch, int war ein 16-Bit-Wert; Auf einigen Maschinen (z. B. Cray) war es auch ein 64-Bit-Wert. Auch die ‘genauen Breitentypen’ wie z int64_t sind nicht zu 100 % tragbar; Sie werden nur definiert, wenn die Architektur einen solchen Typ unterstützt. Das int_least64_t Typen sind so nah wie möglich an portable.

    – Jonathan Leffler

    gestern

  • Die C11-Spezifikation ist §7.21.6.1 Die fprintf Funktion — der Eintrag in §7.21.6.3 Die printf Funktion leitet größtenteils zu ¶7.21.6.1 um. Die POSIX-Spezifikation ist printf().

    – Jonathan Leffler

    gestern


  • int ist auch nicht tragbar, kann aber in manchen Fällen die beste Wahl sein; zum Beispiel der Index eines kleinen for loop erfordert normalerweise keine Portabilität. Auf der anderen Seite,long ist nicht tragbar und es ist nie nützlich und nie die beste Wahl. long ist einfach schlecht. Wenn Sie etwas brauchen, das garantiert 32 Bit oder 64 Bit groß ist, dann verwenden Sie es uint32_t oder uint64_t. Einfach. Wenn sie auf einer exotischen Plattform nicht verfügbar sind, wird Ihr Code nicht kompiliert, was Sie wollen.

    – März

    gestern

  • Zu diesem Thema: faultlore.com/blah/c-isnt-a-language

    – März

    vor 20 Stunden

Benutzeravatar von postfuturist
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 sein printf("%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 %ldum mit der OP-Frage harmonischer zu sein.

    – DrBeco

    21. Juni 2015 um 5:28 Uhr

  • Ja, Dr. Beco; weiter, nur %l löst aus warning: unknown conversion type character 0x20 in format [-Wformat]

    – Patrizio Bertoni

    29. Juli 2015 um 10:53 Uhr

Blorgbeards Benutzeravatar
Blorgbart

Ich denke du meinst:

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

oder

long n;
printf("%ld", n);   // signed long

Benutzeravatar von Dave Dopson
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 mit nvcc a long 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 darin long oder unsigned long Variablen. Tatsächlich musste vor ein paar Wochen ein Kollege von mir, der Code von Windows auf Linux portiert hat, alle unsere ändern longs zu uint32_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".

Benutzeravatar von Rob Walker
Rob Walker

%ld sehen printf Referenz auf cplusplus.com

Benutzeravatar von Dolan Antenucci
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).

Benutzeravatar von Andrew O'Reilly
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

  • Nein: Es gibt keine Plattformabhängigkeit vom richtigen Format für den Druck a long – die richtige Antwort ist %ld. Der Wertebereich, der gedruckt werden kann, hängt von der Plattform ab – auf einigen Plattformen long wird ein 32-Bit-Typ sein (insbesondere im Jahr 2008) und auf anderen Plattformen wird es ein 64-Bit-Typ sein (insbesondere im Jahr 2022 und später). Aber wenn der Datentyp ist longdas richtige printf() Konvertierungsbezeichner ist %ld (obwohl Sie verwenden können %li).

    – Jonathan Leffler

    gestern

1431610cookie-checkWas ist der Konvertierungsspezifizierer für printf, der ein long formatiert?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy