web-dev-qa-db-fra.com

Comment imprimer 1 octet avec printf?

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 ?

2
ahg8tOPk78

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.

8
Sourav Ghosh

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.

4
Bathsheba

Vous pouvez utiliser la solution suivante pour imprimer un octet avec printf:

unsigned char c = 255;
printf("Unsigned char: %hhu\n", c);
1
macario

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.

0
Ton Plooij