Vous pouvez utiliser hhpour indiquer printfque l'argument est un caractère non signé. Utilisez 0pour obtenir un remplissage nul et 2pour définir la largeur sur 2. xou Xpour 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 printflien . 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 Xspécificateur de conversion applique à une signed charou unsigned charargument (l'argument aura été promu en fonction des promotions entières, mais sa valeur est convertie en signed charou unsigned charavant l' impression); ou qu'un nspécificateur de conversion suivant s'applique à un pointeur vers un signed charargument.
"\xc0\xc0abc123"