Możesz użyć, hh
aby powiedzieć, printf
że argument jest bez znaku. Użyj, 0
aby uzyskać dopełnienie zerowe i 2
ustawić szerokość na 2. x
lub X
dla 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 X
specyfikacją konwersji stosuje się do signed char
lub unsigned char
argument (argument nie będzie promowane według promocji całkowitych, ale jego wartość powinna być przekształcony signed char
albo unsigned char
przed wydrukowaniem); lub że następujący n
specyfikator konwersji ma zastosowanie do wskaźnika do signed char
argumentu.
"\xc0\xc0abc123"