Je sais qu'en utilisant %x
avec printf()
, nous imprimons 4 octets (une int
en hexadécimal) depuis la pile. Mais je voudrais imprimer seulement 1 octet. Y a-t-il un moyen de faire cela ?
Hypothèse: Vous voulez imprimer la valeur d’une variable d’une largeur de 1 octet, c.-à-d. char
.
Si vous avez une variable char
, par exemple, char x = 0;
et que vous souhaitez imprimer la valeur, utilisez le spécificateur de format %hhx
avec printf()
.
Quelque chose comme
printf("%hhx", x);
Sinon, en raison de la promotion des arguments par défaut, une instruction comme
printf("%x", x);
serait également correct, car printf()
ne lira pas la sizeof(unsigned int)
à partir de stack , la valeur de x
sera lue en fonction de son type et sera promue au type requis de toute façon.
Vous devez faire attention à ce que vous faites pour éviter tout comportement non défini.
Le standard C vous permet de convertir la int
en unsigned char
, puis d’imprimer l’octet souhaité à l’aide de pointer arithmetic:
int main()
{
int foo = 2;
unsigned char* p = (unsigned char*)&foo;
printf("%x", p[0]); // outputs the first byte of `foo`
printf("%x", p[1]); // outputs the second byte of `foo`
}
Notez que p[0]
et p[1]
sont convertis en un type plus large (la int
) avant d'afficher le résultat.
Vous pouvez utiliser la solution suivante pour imprimer un octet avec printf
:
unsigned char c = 255;
printf("Unsigned char: %hhu\n", c);
Si vous souhaitez imprimer un seul octet présent dans un type de valeur plus grand, vous pouvez masquer et/ou décaler la valeur requise (par exemple, int x = 0x12345678; x & 0x00FF0000 >> 16). Ou récupérez simplement l'octet requis en définissant l'emplacement de l'octet requis à l'aide d'un pointeur de caractère (non signé) et d'un offset.