Wie formatiert man ein unsigned long long int mit printf?

Lesezeit: 6 Minuten

andrewrks Benutzeravatar
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

Benutzeravatar von John Downey
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

Benutzeravatar von Shivam Chauhan
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

Benutzeravatar von Nathan Fellman
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:

#include <inttypes.h>

uint64_t x;
uint32_t y;

printf("x: %"PRIu64", y: %"PRIu32"\n", x, y);

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

Benutzeravatar von Paul Hargreaves
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

Benutzeravatar von ST3
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

Benutzeravatar von Sandy
Sandig

Kompilieren Sie es als x64 mit VS2005:

%llu funktioniert gut.

1427790cookie-checkWie formatiert man ein unsigned long long int mit printf?

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

Privacy policy