web-dev-qa-db-fra.com

Comment imprimer un entier 64 bits au format hexadécimal?

Avec le code suivant, j'essaie de générer la valeur d'une variable unit64_t À l'aide de printf(). La compilation du code avec gcc renvoie l'avertissement suivant:

warning: le format '% x' attend un argument de type 'unsigned int', mais l'argument 2 a le type 'uint64_t' [-Wformat =]

Le code:

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

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

    return 0;
}

Le résultat:

val = 0x90abcdef

Production attendue:

val = 0x1234567890abcdef

Comment puis-je générer une valeur 64 bits sous forme d'entier hexadécimal à l'aide de printf()? Le spécificateur x semble être faux dans ce cas.

22
sergej

L’avertissement de votre compilateur vous indique que votre spécificateur de format ne correspond pas au type de données que vous lui transmettez.

Essayez d’utiliser %lx Ou %llx. Pour plus de portabilité, incluez inttypes.h Et utilisez la macro PRIx64.

Par exemple: printf("val = 0x%" PRIx64 "\n", val); (notez qu'il s'agit d'une concaténation de chaîne)

36
tangrs

Edit: Utilisez plutôt printf("val = 0x%" PRIx64 "\n", val);.

Essayez printf("val = 0x%llx\n", val);. Voir le printf manpage :

ll (ell-ell). Une conversion entière suivante correspond à un argument long long int ou unsigned long long int, ou une conversion n suivante correspond à un pointeur sur un argument long long int.

Edit: Encore mieux est ce que @M_Oehm a écrit: Il existe une macro spécifique pour cela, car unit64_t n'est pas toujours un unsigned long long: PRIx64 voir aussi cette réponse stackoverflow

5
Superlokkus