2013-08-07 15 views
14

Potrzebuję wydrukować wartość ULONGLONG (ULONGLONG wartość (unsigned __int64). Jakiego formatu powinienem użyć w printf? Znalazłem %llu w innym pytaniu, ale mówią, że jest tylko dla Linuksa.Format printf dla niepodpisanego __int64 w systemie Windows

Dzięki za pomoc.

+0

można używać std :: cout? To powinno po prostu działać. –

+0

Nie mogę. Funkcja, której używam, to wrapper ze zmienną listą argumentów, która używa printf i której nie mogę zmodyfikować. – Virus721

+0

Przeczytaj również: [Zabawna rzecz z sprintfem] (http://stackoverflow.com/questions/17065203/a-funny-thing-with-sprintf/17065245#17065245) –

Odpowiedz

23

Korzystanie z Google do wyszukiwania dla „Visual Studio printf unsigned __int64” produkuje this page jako pierwszy wynik, który mówi, można użyć prefiksu I64, więc specyfikator formatu byłoby %I64u.

+0

Wydaje się działać. Dzięki ! – Virus721

+1

Inny wybór to makro 'PRIu64' zdefiniowane w' inttypes.h' –

+0

@GrijeshChauhan: 'PRIu64' i' inttypes.h' nie są obsługiwane w Visual Studio (przynajmniej nie przez Microsoft). –

1

Printf ma różne specyfikatory formatu dla unsigned long long w zależności od kompilatora, widziałem %llu i %Lu. Ogólnie, radziłbym ci zamiast tego używać std::cout i podobnych.

+1

Pytanie jest oznaczone zarówno "c" i "C++". W języku C, 'std :: cout' jest niczym więcej niż błędem składni. –

6

%llu to standardowy sposób drukowania unsigned long long, to nie tylko dla Linuksa, w rzeczywistości jest w C99. Tak więc problemem jest użycie kompilatora zgodnego z C99, tj. Nie Visual Studio.

C99 funkcje 7.19.6 sformatowany wejścia/wyjścia

ll (Ell-łokieć) stwierdza, że ​​po d, O, U, stosuje specyfikator X lub X konwersji do długo long int lub unsigned long long int argument; lub, że następujący wskaźnik konwersji n ma zastosowanie do wskaźnika do wzdłuż długiego argumentu int.

+2

Nie zawracałbym sobie tym głowy, gdybym mógł wybrać oprogramowanie, z którym pracuję. – Virus721

+1

Niestety, Microsoft nie definiuje "ULONGLONG" jako "unsigned long long". Na [tę stronę] (http://msdn.microsoft.com/en-us/library/cc230393.aspx) jest to "unsigned __int64".Używanie formatu 'unsigned long long' może działać lub nie, ale jeśli chcesz, aby twój kod przetrwał aktualizacje kompilatora i przyszłe migracje, powinieneś trzymać się specyfikacji tego typu. –

+0

@ Virus721 Twoje pytanie mówi, że musisz go używać w systemie Windows, nie mówiąc o Visual Studio. –

2

Zalecam stosowanie formatu PRIu64 określonego ze standardowej biblioteki C. Został zaprojektowany, aby zapewnić użytkownikom specyfikator formatu niepodpisanej 64-bitowej liczby całkowitej na różnych architekturach.

Oto przykład (w C, nie 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; 
} 
+3

Visual Studio nie obsługuje 'stdint.h' lub' inttypes.h'. Nie obsługuje wersji C 1999. Istnieją [implementacje innych firm] (http://code.google.com/p/msinttypes/). –

+2

@EricPostpischil: Czy faceci z Microsoftu całkowicie stracili rozum? :( –

+1

Dziękuję za twoją pomoc, ale% I64d wykonuje to zadanie: – Virus721

0

Oto obejścia dla wyjścia HEX

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