Wie formatiert man ein unsigned long long int mit printf?
Lesezeit: 6 Minuten
andrewrk
#include <stdio.h>
int main() {
unsigned long long int num = 285212672; //FYI: fits in 29 bits
int normalInt = 5;
printf("My number is %d bytes wide and its value is %ul. A normal number is %d.\n", sizeof(num), num, normalInt);
return 0;
}
Ausgabe:
My number is 8 bytes wide and its value is 285212672l. A normal number is 0.
Ich nehme an, dieses unerwartete Ergebnis stammt vom Drucken der unsigned long long int. Wie geht es dir? printf() ein unsigned long long int?
Ich habe gerade Ihren Code ( mit %llu ) mit gcc kompiliert und die Ausgabe war die richtige. Übergeben Sie Optionen an den Compiler?
– Juan
7. August 2008 um 23:13 Uhr
Beachten Sie, dass Newlib von Samsung Bada “%lld” nicht zu unterstützen scheint: developer.bada.com/forum/…
– RzR
7. Oktober 2010 um 10:42 Uhr
Siehe auch stackoverflow.com/questions/5140871/sprintf-for-unsigned-int64
– Hippiepfad
3. April 2011 um 9:51 Uhr
Ich würde vorschlagen, stdint.h zu verwenden und die Anzahl der Bits in Ihrer Variablen explizit anzugeben. Wir befinden uns immer noch in einer Übergangsphase zwischen 32- und 64-Bit-Architekturen, und “unsigned long long int” bedeutet nicht auf beiden dasselbe.
– BD in Rivenhill
13. Mai 2011 um 22:19 Uhr
John Downey
Verwenden Sie den Modifikator ll (el-el) long-long mit der Konvertierung u (unsigned). (Funktioniert unter Windows, GNU).
printf("%llu", 285212672);
Oder um genau zu sein, es ist für GNU libc und funktioniert nicht mit Microsofts C-Laufzeit.
– Markus Bäcker
8. Oktober 2008 um 9:35 Uhr
Dies ist keine Linux/UNIX-Sache, der Längenmodifikator “ll” wurde in C99 zu Standard C hinzugefügt. Wenn er in “Microsoft C” nicht funktioniert, liegt das daran, dass sie nicht standardkonform sind.
– Robert Gamble
17. Oktober 2008 um 4:46 Uhr
Funktioniert bei mir in VS2008. Darüber hinaus soll, soweit ich mich erinnere, der MS C-Compiler (wenn er zum Kompilieren von reinem C eingerichtet ist) von Natur aus C90-kompatibel sein; C99 führte einige Dinge ein, die nicht allen gefielen.
– スーパーファミコン
11. Oktober 2009 um 20:57 Uhr
Eine Sache, die Sie hier beachten sollten, ist, dass Sie mehrere passieren long long Argumente zu printf und benutze die falsches Format für einen von ihnen, sagen wir %d Anstatt von %llddann werden sogar die Argumente gedruckt nach der falsche kann komplett ausgeschaltet sein (oder sogar dazu führen printf zerstören). Im Wesentlichen werden Variablenargumente ohne Typinformationen an printf übergeben. Wenn also die Formatzeichenfolge falsch ist, ist das Ergebnis unvorhersehbar.
– dimitrii
23. Januar 2012 um 23:10 Uhr
Hörte Herb Sutter in einem Interview sagen, dass Microsofts Kunden nicht nach C99 fragen, also wurde ihr reiner C-Compiler bei C90 eingefroren. Das gilt, wenn Sie als C kompilieren. Wenn Sie als C++ kompilieren, wie andere oben angemerkt haben, sollte es Ihnen gut gehen.
– ahcox
19. September 2012 um 20:29 Uhr
Shivam Chauhan
%d–> für int
%u–> für unsigned int
%ld–> für long int oder long
%lu–> für unsigned long int oder long unsigned int oder unsigned long
%lld–> für long long int oder long long
%llu–> für unsigned long long int oder unsigned long long
Nathan Fellmann
Sie können versuchen, die inttypes.h-Bibliothek zu verwenden, die Ihnen Typen wie z int32_t, int64_t, uint64_t usw. Sie können dann seine Makros verwenden, wie zum Beispiel:
Dies ist “garantiert”, um Ihnen nicht die gleichen Probleme zu bereiten wie long, unsigned long long usw., da Sie nicht erraten müssen, wie viele Bits in jedem Datentyp enthalten sind.
wobei diese PRId64, PRId32 Makros definiert?
– happy_marmoset
12. Dezember 2013 um 12:31 Uhr
@happy_marmoset: Sie sind definiert in inttypes.h
– Nathan Fellmann
12. Dezember 2013 um 14:49 Uhr
Ich denke, Sie brauchen PRIu64 und PRIu32 für Ganzzahlen ohne Vorzeichen.
– Lasse Kliemann
3. Juni 2016 um 15:08 Uhr
Beachten Sie, dass diese Typen mit exakter Breite Optionalda es da draußen Architekturen gibt, die habe nicht Integer-Typen mit genau diesen Breiten. Nur der leastX und fastX Typen (die tatsächlich breiter als angegeben sein können) sind obligatorisch.
– DevSolar
9. Juli 2018 um 15:01 Uhr
Nathan Fellman, bitte korrigieren Sie diese hoch bewertete Antwort: "PRId64" –> "PRIu64". Ebenso für 32-Bit.
– chux – Wiedereinsetzung von Monica
17. Februar um 17:58 Uhr
Für long long (oder __int64) mit MSVS sollten Sie %I64d verwenden:
__int64 a;
time_t b;
...
fprintf(outFile,"%I64d,%I64d\n",a,b); //I is capital i
Paul Hargreaves
Das liegt daran, dass %llu unter Windows nicht richtig funktioniert und %d keine 64-Bit-Ganzzahlen verarbeiten kann. Ich schlage vor, stattdessen PRIu64 zu verwenden, und Sie werden feststellen, dass es auch auf Linux portierbar ist.
Versuchen Sie stattdessen Folgendes:
#include <stdio.h>
#include <inttypes.h>
int main() {
unsigned long long int num = 285212672; //FYI: fits in 29 bits
int normalInt = 5;
/* NOTE: PRIu64 is a preprocessor macro and thus should go outside the quoted string. */
printf("My number is %d bytes wide and its value is %" PRIu64 ". A normal number is %d.\n", sizeof(num), num, normalInt);
return 0;
}
Ausgabe
My number is 8 bytes wide and its value is 285212672. A normal number is 5.
+1 für den Verweis auf PRIu64, den ich noch nie gesehen hatte, aber das scheint (zumindest) nicht auf 64-Bit-Linux portierbar zu sein, da PRIu64 zu “lu” anstelle von “llu” erweitert wird.
– BD in Rivenhill
13. Mai 2011 um 22:15 Uhr
Und warum soll das schlimm sein? Ein Long ist ein 64-Bit-Wert auf 64-Bit-Linux, wie auf jedem anderen Betriebssystem außer Windows.
– Klingeln
4. März 2012 um 15:06 Uhr
@BDatRivenhill Linux/Unix verwendet LP64, bei dem die Länge 64 Bit beträgt
– phuklv
16. April 2014 um 12:51 Uhr
Um es jedoch tragbarer zu machen, verwenden Sie int64_t stattdessen, weil es durchaus einige Implementierungen geben kann, bei denen long long größer als long ist
– phuklv
21. Januar 2015 um 4:12 Uhr
"%" PRIu64 Streichhölzer uint64_t und "%llu" Streichhölzer unsigned long long. Diese Antwort hat "%" PRIu64 mit unsigned long long. Dieser Ansatz pflanzt Samen für UB, wenn unsigned long long ist mehr als 64-Bit. Am besten vermeiden.
– chux – Wiedereinsetzung von Monica
17. Februar um 18:04 Uhr
ST3
Unter Linux ist es %llu und in Windows ist es %I64u
Obwohl ich festgestellt habe, dass es in Windows 2000 nicht funktioniert, scheint es dort einen Fehler zu geben!
+1 für den Verweis auf PRIu64, den ich noch nie gesehen hatte, aber das scheint (zumindest) nicht auf 64-Bit-Linux portierbar zu sein, da PRIu64 zu “lu” anstelle von “llu” erweitert wird.
– BD in Rivenhill
13. Mai 2011 um 22:15 Uhr
Und warum soll das schlimm sein? Ein Long ist ein 64-Bit-Wert auf 64-Bit-Linux, wie auf jedem anderen Betriebssystem außer Windows.
– Klingeln
4. März 2012 um 15:06 Uhr
@BDatRivenhill Linux/Unix verwendet LP64, bei dem die Länge 64 Bit beträgt
– phuklv
16. April 2014 um 12:51 Uhr
Um es jedoch tragbarer zu machen, verwenden Sie int64_t stattdessen, weil es durchaus einige Implementierungen geben kann, bei denen long long größer als long ist
– phuklv
21. Januar 2015 um 4:12 Uhr
"%" PRIu64 Streichhölzer uint64_t und "%llu" Streichhölzer unsigned long long. Diese Antwort hat "%" PRIu64 mit unsigned long long. Dieser Ansatz pflanzt Samen für UB, wenn unsigned long long ist mehr als 64-Bit. Am besten vermeiden.
– chux – Wiedereinsetzung von Monica
17. Februar um 18:04 Uhr
Sandig
Kompilieren Sie es als x64 mit VS2005:
%llu funktioniert gut.
14277900cookie-checkWie formatiert man ein unsigned long long int mit printf?yes
Ich habe gerade Ihren Code ( mit %llu ) mit gcc kompiliert und die Ausgabe war die richtige. Übergeben Sie Optionen an den Compiler?
– Juan
7. August 2008 um 23:13 Uhr
Beachten Sie, dass Newlib von Samsung Bada “%lld” nicht zu unterstützen scheint: developer.bada.com/forum/…
– RzR
7. Oktober 2010 um 10:42 Uhr
Siehe auch stackoverflow.com/questions/5140871/sprintf-for-unsigned-int64
– Hippiepfad
3. April 2011 um 9:51 Uhr
Ich würde vorschlagen, stdint.h zu verwenden und die Anzahl der Bits in Ihrer Variablen explizit anzugeben. Wir befinden uns immer noch in einer Übergangsphase zwischen 32- und 64-Bit-Architekturen, und “unsigned long long int” bedeutet nicht auf beiden dasselbe.
– BD in Rivenhill
13. Mai 2011 um 22:19 Uhr