Вы можете использовать, 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"