Ви можете використовувати, 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аргумент.
"\xc0\xc0abc123"