2015-08-20 19 views
11

Con il seguente codice, sto cercando di restituire il valore di una variabile unit64_t utilizzando printf(). Compilare il codice con gcc, restituisce il seguente avviso:Come stampare un numero intero a 64 bit come esadecimale?

avvertimento: formato '% x' si aspetta argomento di tipo 'unsigned int', ma argomento 2 è di tipo 'uint64_t' [-Wformat =]

Il codice:

#include <stdio.h> 
#include <stdint.h> 

int main() 
{ 
    uint64_t val = 0x1234567890abcdef; 
    printf("val = 0x%x\n", val); 

    return 0; 
} 

L'output:

val = 0x90abcdef 

uscita prevista:

val = 0x1234567890abcdef 

Come posso uscita un valore a 64 bit come un intero esadecimale utilizzando printf()? L'identificatore x sembra essere sbagliato in questo caso.

+2

Sede [qui] (http: // StackOverflow. com/domande/9225567/how-to-print-un-Int64-t-type-in-c/9.225.648 # 9.225.648). in pratica, usa la macro 'PRIx64' da' '. –

risposta

19

L'avviso del compilatore indica che l'identificatore di formato non corrisponde al tipo di dati che si sta passando ad esso.

Provare a utilizzare %lx o %llx. Per una maggiore portabilità, includere inttypes.h e utilizzare la macro PRIx64.

Ad esempio: printf("val = 0x%" PRIx64 "\n", val); (si noti che si tratta di concatenazione di stringhe)

2

Edit: Usa printf("val = 0x%" PRIx64 "\n", val); invece. Prova invece a printf("val = 0x%llx\n", val);. Vedi il printf manpage:

ll (ell ell). Una successiva conversione di numeri interi corrisponde a un long long int long o unsigned long long int, oppure una successiva conversione n corrisponde a un puntatore a un argomento long long int.

Edit: Ancora meglio è quello che @M_Oehm ha scritto: C'è una macro specifica per questo, perché unit64_t non è sempre una unsigned long long: PRIx64 puoi anche this stackoverflow answer

+0

Non credo che la tua modifica sia corretta - non è "% PRIx64" - è una stringa concat con il valore definito dalla macro PRIx64 –

+0

@DavidLjungMadison Avevi ragione, risolto – Superlokkus

Problemi correlati