Und wenn Sie C++ unter Linux verwenden, stellen Sie sicher, dass Sie dies tun #define __STDC_FORMAT_MACROS vor dem Einschließen inttypes.h.
– kl
28. November 2014 um 8:50 Uhr
PRId64 ist ein Makro, das intern in übersetzt wird "lld". Es ist also so gut wie das Schreiben printf("%lld\n", t); Siehe Artikelbeschreibung : qnx.com/developers/docs/6.5.0/…
– Gaurav
14. August 2015 um 11:32 Uhr
@Gaurav, das stimmt auf einigen Plattformen, aber nicht auf allen. Auf meinem AMD64-Linux-Rechner ist PRId64 beispielsweise definiert als ld. Portabilität ist der Grund für das Makro.
– Ethan T
28. Juni 2016 um 15:06 Uhr
Ich denke, mit etwas mehr Aufwand hätten sie es noch unausstehlicher machen können
Wenn Sie mit einer C89-Implementierung (insbesondere Visual Studio) feststecken, können Sie vielleicht eine Open Source verwenden <inttypes.h> (und <stdint.h>): http://code.google.com/p/msinttypes/
Wenn ich msinttypes vom code.google.com-Link verwende, muss ich __STDC_FORMAT_MACROS definieren. Siehe stackoverflow.com/questions/8132399/how-to-printf-uint64-t.
– Ariscris
28. Mai 2014 um 16:49 Uhr
Danke für den Hinweis, @ariscris. Es scheint jedoch, dass Makros nur für C++ erforderlich sind. Die Definitionen im verknüpften Code befinden sich in a #if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS)
– pmg
28. Mai 2014 um 17:08 Uhr
pjhsea
Mit C99 die %j Der Längenmodifikator kann auch mit der printf-Funktionsfamilie verwendet werden, um Werte des Typs auszugeben int64_t und uint64_t:
#include <stdio.h>
#include <stdint.h>
int main(int argc, char *argv[])
{
int64_t a = 1LL << 63;
uint64_t b = 1ULL << 63;
printf("a=%jd (0x%jx)\n", a, a);
printf("b=%ju (0x%jx)\n", b, b);
return 0;
}
Kompilieren Sie diesen Code mit gcc -Wall -pedantic -std=c99 erzeugt keine Warnungen und das Programm gibt die erwartete Ausgabe aus:
Dies ist gem printf(3) auf meinem Linux-System (die Manpage sagt das ausdrücklich j wird verwendet, um eine Umwandlung in an anzuzeigen intmax_t oder uintmax_t; in meiner stdint.h beides int64_t und intmax_t werden auf genau die gleiche Weise typdefiniert, und ähnlich für uint64_t). Ich bin mir nicht sicher, ob dies perfekt auf andere Systeme übertragbar ist.
Wenn %jd druckt ein intmax_twäre der korrekte Aufruf printf("a=%jd (0x%jx)", (intmax_t) a, (intmax_t) a). Dafür gibt es keine Garantie int64_t und intmax_t sind vom gleichen Typ, und wenn sie es nicht sind, ist das Verhalten undefiniert.
– Benutzer4815162342
25. April 2013 um 17:56 Uhr
Sie können tragbar verwenden %jd zu drucken int64_t Werte wenn Sie konvertieren sie explizit in intmax_t bevor Sie sie weitergeben printf: printf("a=%jd\n", (intmax_t)a). Dies vermeidet die (IMHO) Hässlichkeit des <inttypes.h> Makros. Dies setzt natürlich voraus, dass Ihre Implementierung dies unterstützt %jd, int64_tund intmax_tdie alle von C99 hinzugefügt wurden.
– Keith Thompson
12. August 2013 um 19:03 Uhr
@KeithThompson ‘Häßlichkeit’ drückt es viel, viel, viel zu freundlich aus, Kumpel. Es ist absolut scheußlich. Es ist gruselig. Es ist ekelerregend. Es ist peinlich, was es ist. Oder zumindest sollten sie sich schämen, die Leute, die das eingeführt haben. Ich habe diese Makros noch nie gesehen, aber tun Sie, was diese Antwort und die Kommentare – einschließlich Ihrer – vorschlagen.
– Pryftan
3. Dezember 2019 um 22:59 Uhr
@ Pryftan Ich nicht ziemlich finde sie genauso hässlich wie du – und ich bin mir überhaupt nicht sicher, wie sie ohne Sprachänderungen weniger hässlich definiert werden könnten.
– Keith Thompson
4. Dezember 2019 um 2:28 Uhr
@KeithThompson Nun, ich bin dankbar, dass du zumindest das Wort “ziemlich” betont hast. Nun, eigentlich ist es egal. Ich verstehe nicht, warum die Makros dort sein müssen. Wie Sie sagen, können Sie portabel … usw. Aber dann finde ich auch, dass die Erhöhung der Anzahl der Schlüsselwörter auch aus dem Ruder gelaufen ist.
– Pryftan
14. Dezember 2019 um 20:46 Uhr
Aus der eingebetteten Welt kommend, wo sogar uclibc nicht immer verfügbar ist, und Code wie
%lld ist das Format für long long intwelches ist nicht unbedingt gleich int64_t. <stdint.h> hat ein Makro für das richtige Format für int64_t; Siehe Ouahs Antwort.
– Keith Thompson
12. August 2013 um 19:05 Uhr
@KeithThompson Aber da long long ist mindestens 64-Bit, printf("%lld", (long long)x); sollte funktionieren, außer vielleicht für -0x8000000000000000, was nicht als darstellbar wäre long long wenn dieser Typ kein Zweierkomplement verwendet.
– Pascal Cuoq
12. August 2013 um 20:54 Uhr
@PascalCuoq: Ja, es sollte mit der Besetzung funktionieren (und die von Ihnen erwähnte Ausnahme ist sehr unwahrscheinlich und gilt nur für ein System, das Zweierkomplement unterstützt, es aber nicht verwendet long long).
– Keith Thompson
12. August 2013 um 21:10 Uhr
HarshaD
Stolperte über diese Frage, als ich nach einer Möglichkeit suchte, 64-Bit-Zahlen in Hex anzuzeigen:
Herausgefunden, dass Sie verwenden können:
0x%016llx – funktioniert zumindest mit meinem Compiler (aarch64 GCC 7.3.0)
%lld ist das Format für long long intwelches ist nicht unbedingt gleich int64_t. <stdint.h> hat ein Makro für das richtige Format für int64_t; Siehe Ouahs Antwort.
– Keith Thompson
12. August 2013 um 19:05 Uhr
@KeithThompson Aber da long long ist mindestens 64-Bit, printf("%lld", (long long)x); sollte funktionieren, außer vielleicht für -0x8000000000000000, was nicht als darstellbar wäre long long wenn dieser Typ kein Zweierkomplement verwendet.
– Pascal Cuoq
12. August 2013 um 20:54 Uhr
@PascalCuoq: Ja, es sollte mit der Besetzung funktionieren (und die von Ihnen erwähnte Ausnahme ist sehr unwahrscheinlich und gilt nur für ein System, das Zweierkomplement unterstützt, es aber nicht verwendet long long).
Für C++ siehe stackoverflow.com/questions/8132399/how-to-printf-uint64-t
– Antonio
23. August 2016 um 9:02 Uhr