Почему printf не распечатывает только один байт при печати hex?

pixel_data Это vector of char.

когда я делаю printf(" 0x%1x ", pixel_data[0] ) Я ожидаю увидеть 0xf5.

но я 0xfffffff5 как будто я распечатывал 4-байтовое целое число вместо 1 байта.

почему это? Я дал printf a char для печати - это всего 1 байт, так почему же printf печать 4?

NB. the printf реализация завернута внутри стороннего API, но просто интересно, является ли это особенностью стандарта printf?

5 ответов


вы, вероятно, получаете доброкачественную форму неопределенного поведения, потому что %x модификатор ожидает и char обычно будет повышен до int при переходе на С varargs


лучше использовать флаги стандартного формата

printf(" %#1x ", pixel_data[0] );

затем ваш компилятор помещает шестнадцатеричный префикс для вас.


затем length модификатор-минимальная длина.


использовать %hhx

printf("%#04hhx ", foo);

спецификатор ширины в printf фактически минимальная ширина. Вы можете сделать printf(" 0x%2x ", pixel_data[0] & 0xff) печатать Лоус байт (примечание 2, для печати двух символов, если pixel_data[0] например 0xffffff02).