Ви можете використовувати, 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"