printf-Format für unsigned __int64 unter Windows

Lesezeit: 4 Minuten

Ich muss eine drucken ULONGLONG Wert (unsigned __int64). Welches Format soll ich verwenden printf ? ich fand %llu in einer anderen Frage, aber sie sagen, es ist nur für Linux.

Danke für Ihre Hilfe.

  • Kannst du std::cout verwenden? Es sollte einfach funktionieren.

    – Neil Kirk

    7. August 2013 um 15:26 Uhr

  • Ich kann nicht. Die Funktion, die ich verwende, ist ein Wrapper mit variabler Argumentliste, die printf verwendet und die ich nicht ändern kann.

    – Virus721

    7. August 2013 um 15:27 Uhr


  • Lesen Sie dies auch: Eine lustige Sache mit sprintf

    – Grijesh Chauhan

    7. August 2013 um 16:01 Uhr

  • %llu ist nicht nur für Linux; Es ist das Format, das vom ISO-C-Standard definiert wird, beginnend mit der Ausgabe von 1999. Leider unterstützt die C-Implementierung von Microsoft C99 oder höher nicht. Mit anderen Worten, es ist Windows, nicht Linux, das ist der Sonderfall.

    – Keith Thompson

    7. August 2013 um 16:48 Uhr

Die Verwendung von Google zur Suche nach „Visual Studio printf unsigned __int64“ erzeugt diese Seite als erstes Ergebnis, das besagt, dass Sie das Präfix verwenden können I64also wäre der Formatbezeichner %I64u.

  • Andere Wahl ist Makro PRIu64 definiert in inttypes.h

    – Grijesh Chauhan

    7. August 2013 um 16:04 Uhr

  • @GrijeshChauhan: PRIu64 und inttypes.h werden in Visual Studio nicht unterstützt (zumindest nicht von Microsoft).

    – Eric Postpischil

    7. August 2013 um 16:45 Uhr


  • Seien Sie sich bewusst, dass beides __int64 und %I64u sind spezifisch für Visual Studio, sodass Ihr Code nicht auf andere Implementierungen portierbar ist.

    – Keith Thompson

    7. August 2013 um 16:48 Uhr

  • Es ist nicht in den Plänen 😛

    – Virus721

    7. August 2013 um 17:52 Uhr

  • Eigentlich … wenn Sie Google verwenden, um nach “Visual Studio printf unsigned __int64” zu suchen, wird produziert DIES Seite als erstes Ergebnis. Vielleicht entfernen Sie das Google-Shaming, um Ihre Antwort zukunftssicher zu machen?

    – hft

    17. Juni 2021 um 20:47 Uhr

Benutzer-Avatar
Yu Hao

%llu ist die Standardmethode zum Drucken unsigned long long, es ist nicht nur für Linux, es ist tatsächlich in C99. Das Problem besteht also eigentlich darin, einen C99-kompatiblen Compiler zu verwenden, also nicht Visual Studio.

C99 7.19.6 Formatierte Ein-/Ausgabefunktionen

ll(ell-ell) Gibt an, dass ein nachfolgender d-, ​​i-, o-, u-, x- oder X-Konvertierungsspezifizierer auf ein long long int- oder unsigned long long int-Argument angewendet wird; oder dass ein folgender n-Konvertierungsbezeichner auf einen Zeiger auf ein langes int-Argument angewendet wird.

  • Ich würde mich nicht darum kümmern, wenn ich wählen könnte, mit welcher Software ich arbeite.

    – Virus721

    7. August 2013 um 15:33 Uhr

  • Leider definiert Microsoft a nicht ULONGLONG ein … sein unsigned long long. Pro diese Seitees ist ein unsigned __int64. Verwenden eines Formats für unsigned long long funktioniert möglicherweise oder auch nicht, aber wenn Sie möchten, dass Ihr Code Compiler-Updates und zukünftige Migrationen überlebt, sollten Sie sich an die Spezifikation des Typs halten.

    – Eric Postpischil

    7. August 2013 um 15:34 Uhr


  • @ Virus721 Ihre Frage besagt, dass Sie es in Windows verwenden müssen, nicht in Visual Studio.

    – Yu Hao

    7. August 2013 um 15:37 Uhr

  • @YuHao: ULONGLONG und __int64 sind Typen in Visual Studio.

    – Eric Postpischil

    7. August 2013 um 15:40 Uhr

  • @EricPostpischil wusste das nicht, sorry dafür. Aber ich denke, es ist immer noch erwähnenswert %llu ist nicht nur Linux. Es ist Microsofts Schuld, C99 nicht zu folgen.

    – Yu Hao

    7. August 2013 um 15:45 Uhr


Ich empfehle Ihnen zu verwenden PRIu64 Format, das aus einer Standard-C-Bibliothek angegeben ist. Es wurde entwickelt, um Benutzern einen Formatbezeichner für vorzeichenlose 64-Bit-Ganzzahlen über verschiedene Architekturen hinweg bereitzustellen.

Hier ist ein Beispiel (in C, nicht C++):

#include <stdint.h>   /* For uint64_t */
#include <inttypes.h> /* For PRIu64 */
#include <stdio.h>    /* For printf */
#include <stdlib.h>   /* For exit status */

int main()
{
    uint64_t n = 1986;
    printf("And the winning number is.... %" PRIu64 "!\n", n);
    return EXIT_SUCCESS;
}

  • Visual Studio wird nicht unterstützt stdint.h oder inttypes.h. C 1999 wird nicht unterstützt. Es gibt Drittanbieter-Implementierungen davon.

    – Eric Postpischil

    7. August 2013 um 15:36 Uhr


  • @EricPostpischil: Haben die Leute bei Microsoft komplett den Verstand verloren? 🙁

    Benutzer405725

    7. August 2013 um 15:37 Uhr

  • Danke für Ihre Hilfe, aber %I64d erledigt den Job.

    – Virus721

    7. August 2013 um 15:37 Uhr

  • @VladLazarenko: Microsoft ist mehr daran interessiert, Geld zu verdienen, als sich an ISO-Standards zu halten. Anscheinend haben sie bisher entschieden, dass die C99-Unterstützung die erforderliche Investition nicht wert ist. Ich mag es auch nicht (es verlangsamt die allgemeine Akzeptanz von C99, ganz zu schweigen von C11), aber ich bin nicht in der Lage zu beurteilen, ob ihre Entscheidung in dem Kontext, in dem sie sie getroffen haben, richtig ist. Sie sind nicht verpflichtet, C99 zu unterstützen – oder C überhaupt zu unterstützen. (Wie viele C-Compiler haben Sie geschrieben?)

    – Keith Thompson

    7. August 2013 um 16:52 Uhr

  • @KeithThompson: Stimme dir diesbezüglich voll und ganz zu. Microsoft besitzt uns nichts. Ich wünschte nur, dass ein Unternehmen mit einer solchen Ressource und einem solchen Einfluss mehr Gutes für die Gesellschaft und Programmierer im Allgemeinen tun würde. Bisher schaffen sie nur Inkonsistenzen 🙂

    Benutzer405725

    7. August 2013 um 16:55 Uhr

Printf hat verschiedene Formatbezeichner für unsigned long long je nach Compiler habe ich gesehen %llu und %Lu. Im Allgemeinen würde ich Ihnen raten, zu verwenden std::cout und ähnliche statt.

Hier ist eine Problemumgehung für die HEX-Ausgabe

printf("%08X%08X", static_cast<UINT32>((u64>>32)&0xFFFFFFFF), static_cast<UINT32>(u64)&0xFFFFFFFF));

1369500cookie-checkprintf-Format für unsigned __int64 unter Windows

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

Privacy policy