Вы можете использовать hh
, чтобы сообщить printf
, что аргумент является беззнаковым символом. Используйте 0
, чтобы получить заполнение нулями, и 2
, чтобы установить ширину 2. x
или X
для шестнадцатеричных символов в нижнем / верхнем регистре.
uint8_t a = 0x0a;
printf("%02hhX", a); // Prints "0A"
printf("0x%02hhx", a); // Prints "0x0a"
Редактировать : Если читатели обеспокоены утверждением 2501 о том, что это как-то не «правильный» спецификатор формата, я предлагаю снова прочитать printf
ссылку . В частности:
Несмотря на то, что% c ожидает аргумент int, безопасно передавать символ из-за целочисленного преобразования, которое происходит при вызове функции с переменным числом.
Правильные спецификации преобразования для типов символов фиксированной ширины (int8_t и т. Д.) Определены в заголовке <cinttypes>
(C ++) или <inttypes.h>
(C) (хотя PRIdMAX, PRIuMAX и т. Д. Являются синонимами % jd,% ju и т. д.) .
Что касается его замечания о подписанном и неподписанном, то в этом случае это не имеет значения, поскольку значения всегда должны быть положительными и легко помещаться в подписанном int. В любом случае, в формате шестнадцатеричного формата со знаком нет подписи.
Редактировать 2 : (издание «когда признаешь, что ошибаешься»):
Если вы прочитаете фактический стандарт C11 на стр. 311 (329 из PDF), вы найдете:
чч: указывает, что следующий аргумент преобразования d
, i
, o
, u
, x
или X
применяется к аргументу signed char
или unsigned char
(аргумент будет повышен в соответствии с целочисленными повышениями, но его значение должно быть преобразовано в signed char
или unsigned char
перед печатью); или что следующий указатель преобразования n
применяется к указателю на аргумент signed char
.