Вы можете использовать, 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, можно безопасно передавать char из-за целочисленного продвижения, которое происходит при вызове функции с переменным числом аргументов.
Правильные спецификации преобразования для символьных типов фиксированной ширины (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
аргумент.
"\xc0\xc0abc123"