Você pode usar hh
para dizer printf
que o argumento é um char sem sinal. Use 0
para obter preenchimento zero e 2
definir a largura como 2. x
ou X
para caracteres hexadecimais em maiúsculas / minúsculas.
uint8_t a = 0x0a;
printf("%02hhX", a); // Prints "0A"
printf("0x%02hhx", a); // Prints "0x0a"
Edit : Se os leitores estão preocupados com a afirmação de 2501 de que este não é, de alguma forma, os especificadores de formato 'corretos', sugiro que leiam o printf
link novamente. Especificamente:
Mesmo que% c espere um argumento int, é seguro passar um caractere por causa da promoção de inteiro que ocorre quando uma função variável é chamada.
As especificações de conversão corretas para os tipos de caracteres de largura fixa (int8_t, etc) são definidas no cabeçalho <cinttypes>
(C ++) ou <inttypes.h>
(C) (embora PRIdMAX, PRIuMAX, etc seja sinônimo de% jd,% ju, etc) .
Quanto ao seu ponto sobre assinado vs não assinado, neste caso não importa, pois os valores devem ser sempre positivos e facilmente caber em um int assinado. De qualquer maneira, não há especificador de formato hexideximal assinado.
Edição 2 : ( edição "quando-admitir-que-você-está-errado"):
Se você ler o padrão C11 real na página 311 (329 do PDF), encontrará:
hh: especifica que a seguinte d
, i
, o
, u
, x
, ou X
especificador de conversão aplica-se a um signed char
ou unsigned char
argumento (o argumento terá sido promovidos de acordo com as promoções de inteiros, mas o seu valor deve ser convertido em signed char
ou unsigned char
antes da impressão); ou que um n
especificador de conversão seguinte se aplica a um ponteiro para um signed char
argumento.
"\xc0\xc0abc123"