Możesz użyć, hhaby powiedzieć, printfże argument jest bez znaku. Użyj, 0aby uzyskać dopełnienie zerowe i 2ustawić szerokość na 2. xlub Xdla małych / wielkich liter szesnastkowych.
uint8_t a = 0x0a;
printf("%02hhX", a); // Prints "0A"
printf("0x%02hhx", a); // Prints "0x0a"
Edycja : Jeśli czytelnicy są zaniepokojeni stwierdzeniem 2501, że nie jest to w jakiś sposób „poprawne” specyfikatory formatu, sugeruję, aby ponownie przeczytali printfłącze . Konkretnie:
Mimo że% c oczekuje argumentu int, można bezpiecznie przekazać znak char z powodu promocji liczby całkowitej, która ma miejsce, gdy wywoływana jest funkcja wariadyczna.
Prawidłowe specyfikacje konwersji dla typów znaków o stałej szerokości (int8_t itp.) Są zdefiniowane w nagłówku <cinttypes>(C ++) lub <inttypes.h>(C) (chociaż PRIdMAX, PRIuMAX itp. Są synonimami% jd,% ju itd . ) .
Jeśli chodzi o jego punkt widzenia ze znakiem i bez znaku, w tym przypadku nie ma to znaczenia, ponieważ wartości zawsze muszą być dodatnie i łatwo zmieścić się w int ze znakiem. W każdym razie nie ma podpisanego specyfikatora formatu szesnastkowego.
Edytuj 2 : (wydanie „kiedy-przyznać-się mylisz”):
Jeśli przeczytasz aktualny standard C11 na stronie 311 (329 pliku PDF), znajdziesz:
gg: określa, że następuje d, i, o, u, x, lub Xspecyfikacją konwersji stosuje się do signed charlub unsigned charargument (argument nie będzie promowane według promocji całkowitych, ale jego wartość powinna być przekształcony signed charalbo unsigned charprzed wydrukowaniem); lub że następujący nspecyfikator konwersji ma zastosowanie do wskaźnika do signed charargumentu.
"\xc0\xc0abc123"