2013-08-07 7 views
14

Devo stampare un valore ULONGLONG (unsigned __int64). Quale formato dovrei usare in printf? Ho trovato %llu in un'altra domanda ma dicono che è solo per linux.formato printf per __int64 senza segno su Windows

Grazie per il vostro aiuto.

+0

Potete utilizzare std :: cout? Dovrebbe funzionare. –

+0

Non posso. La funzione che uso è un wrapper con lista di argomenti variabili che usa printf e che non posso modificare. – Virus721

+0

Leggi anche: [Una cosa divertente con sprintf] (http://stackoverflow.com/questions/17065203/a-funny-thing-with-sprintf/17065245#17065245) –

risposta

23

Utilizzo di Google per la ricerca di “Visual Studio printf __int64 unsigned” produce this page come primo risultato, che dice che si può utilizzare il prefisso I64, in modo che l'identificatore di formato sarebbe %I64u.

+0

Sembra funzionare. Grazie ! – Virus721

+1

Un'altra scelta è la macro 'PRIu64' definita in' inttypes.h' –

+0

@GrijeshChauhan: 'PRIu64' e' inttypes.h' non sono supportati in Visual Studio (almeno, non da Microsoft). –

1

Printf ha diversi identificatori di formato per unsigned long long a seconda del compilatore, ho visto %llu e %Lu. In generale, consiglierei di usare std::cout e simili.

+1

La domanda è codificata sia "c" che "C++". In C, 'std :: cout' non è altro che un errore di sintassi. –

6

%llu è il modo standard per stampare unsigned long long, non è solo per Linux, è in realtà in C99. Quindi il problema è in realtà utilizzare un compilatore compatibile con C99, cioè non Visual Studio.

C99 funzioni 7.19.6 ingresso formattato/uscita

ll (ell-ell) Specifica che un seguito d, i, o, u, vale x, o conversione X specificatore di una lunga argomento int long long long o unsigned long long int; o che un identificatore della conversione n seguente si applica a un puntatore a lungo lungo l'argomento int.

+2

Non mi preoccuperei di questo se potessi scegliere con quale software sto lavorando. – Virus721

+1

Sfortunatamente, Microsoft non definisce un 'ULONGLONG' come un' unsigned long long'. Per [questa pagina] (http://msdn.microsoft.com/en-us/library/cc230393.aspx), è un 'unsigned __int64'.L'utilizzo di un formato per 'long long unsigned 'potrebbe o potrebbe non funzionare, ma, se si desidera che il codice sopravviva agli aggiornamenti del compilatore e alle migrazioni future, è necessario attenersi alle specifiche del tipo. –

+0

@ Virus721 La tua domanda dice che devi usarlo in Windows, non dicendo Visual Studio. –

2

Si consiglia di utilizzare il formato PRIu64 specificato da una libreria C standard. È stato progettato per fornire agli utenti un identificatore di formato per numeri interi a 64 bit senza segno su diverse architetture.

Ecco un esempio (in C, C++ non):

#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 non supporta 'stdint.h' o' inttypes.h'. Non supporta C 1999. Esistono [implementazioni di terze parti] (http://code.google.com/p/msinttypes/). –

+2

@EricPostpischil: I ragazzi di Microsoft hanno perso completamente la testa? :( –

+1

Grazie per il vostro aiuto, ma% I64d fa il lavoro – Virus721

0

Ecco un lavoro in giro per l'uscita HEX

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