2013-08-07 12 views
14

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

Danke für Ihre Hilfe.

+0

Können Sie std :: cout? Es sollte einfach funktionieren. –

+0

kann ich nicht. Die Funktion, die ich benutze, ist ein Wrapper mit variabler Argumentliste, der printf verwendet und den ich nicht ändern kann. – Virus721

+0

Lesen Sie auch dies: [Eine lustige Sache mit Sprintf] (http://stackoverflow.com/questions/17065203/a-funny-thing-with-sprintf/17065245#17065245) –

Antwort

23

Google verwendet für „Visual Studio printf unsigned __int64“ produziert this page als erstes Ergebnis zu suchen, die sagen, dass Sie das Präfix I64 verwenden können, so dass die Formatbezeichner %I64u sein würde.

+0

Scheint zu arbeiten. Vielen Dank ! – Virus721

+1

Andere Wahl ist Makro 'PRIu64' definiert in' inttypes.h' –

+0

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

1

Printf hat verschiedene Formatbezeichner für unsigned long long je nach Compiler habe ich %llu und %Lu gesehen. Generell würde ich Ihnen empfehlen, stattdessen std::cout und ähnliches zu verwenden.

+1

Die Frage ist mit "c" und "C++" markiert. In C ist 'std :: cout' nichts anderes als ein Syntaxfehler. –

6

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

C99 7.19.6 formatierte Eingabe/Ausgabe-Funktionen

ll (ell-ell) Gibt an, dass ein nachfolge d, i, o, u, x, oder X Konvertierungsspezifizierer gilt für eine lange long int oder unsigned long long int Argument; oder dass ein nachfolgender n Konvertierungsspezifizierer auf einen Zeiger entlang eines langen int Arguments angewendet wird.

+2

Ich würde mich nicht damit befassen, wenn ich wählen könnte, mit welcher Software ich arbeite. – Virus721

+1

Leider definiert Microsoft ein "ULONGLONG" nicht als "unsigned long long". Per [diese Seite] (http://msdn.microsoft.com/en-us/library/cc230393.aspx) ist es ein 'unsigned __int64'.Die Verwendung 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 übersteht, sollten Sie sich an die Spezifikation des Typs halten. –

+0

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

2

Ich empfehle Ihnen PRIu64 Format von einer Standard-C-Bibliothek angegeben. Es wurde entwickelt, um Benutzern einen Formatspezifizierer für vorzeichenlose 64-Bit-Ganzzahlen über verschiedene Architekturen hinweg bereitzustellen. Hier

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

#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; 
} 
+3

Visual Studio unterstützt 'stdint.h' oder' nicht inttypes.h'. C 1999 wird nicht unterstützt. Es gibt [Implementierungen von Drittanbietern] (http://code.google.com/p/msinttypes/). –

+2

@EricPostpischil: Haben die Jungs bei Microsoft ihren Verstand verloren? :( –

+1

Danke für Ihre Hilfe, aber% I64d macht den Job. – Virus721

0

Hier ist eine Arbeit um für HEX Ausgabe

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