Vous pouvez utiliser hh
pour indiquer printf
que l'argument est un caractère non signé. Utilisez 0
pour obtenir un remplissage nul et 2
pour définir la largeur sur 2. x
ou X
pour les caractères hexadécimaux minuscules / majuscules.
uint8_t a = 0x0a;
printf("%02hhX", a); // Prints "0A"
printf("0x%02hhx", a); // Prints "0x0a"
Edit : Si les lecteurs sont préoccupés par l'affirmation de 2501 selon laquelle ce n'est pas les spécificateurs de format `` corrects '', je suggère qu'ils relisent le printf
lien . Plus précisément:
Même si% c attend un argument int, il est sûr de passer un caractère en raison de la promotion d'entiers qui a lieu lorsqu'une fonction variadique est appelée.
Les spécifications de conversion correctes pour les types de caractères à largeur fixe (int8_t, etc.) sont définies dans l'en-tête <cinttypes>
(C ++) ou <inttypes.h>
(C) (bien que PRIdMAX, PRIuMAX, etc. soit synonyme de% jd,% ju, etc.) .
Quant à son point sur signé vs non signé, dans ce cas, cela n'a pas d'importance car les valeurs doivent toujours être positives et s'intégrer facilement dans un int signé. Il n'y a de toute façon aucun spécificateur de format hexideximal signé.
Edit 2 : ( édition "quand admettre que vous vous trompez"):
Si vous lisez la norme C11 actuelle à la page 311 (329 du PDF), vous trouvez:
hh: Indique que une suite d
, i
, o
, u
, x
, ou X
spécificateur de conversion applique à une signed char
ou unsigned char
argument (l'argument aura été promu en fonction des promotions entières, mais sa valeur est convertie en signed char
ou unsigned char
avant l' impression); ou qu'un n
spécificateur de conversion suivant s'applique à un pointeur vers un signed char
argument.
"\xc0\xc0abc123"