Подтвердить что ты не робот

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

pixel_data является vector of char.

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

Но я получаю 0xfffffff5, как если бы я печатал 4 байтовое целое вместо 1 байта.

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

NB. реализация printf завершается внутри стороннего API, но просто интересно, является ли эта функция стандартной printf?

4b9b3361

Ответ 1

Вероятно, вы получаете мягкую форму поведения undefined, потому что модификатор %x ожидает параметр unsigned int, а char обычно передается в int при передаче функции varargs.

Вы должны явно указать char в unsigned int для получения прогнозируемых результатов:

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

Обратите внимание, что ширина поля одного не очень полезна. Он просто указывает минимальное количество цифр для отображения, и в любом случае потребуется хотя бы одна цифра.

Если char на вашей платформе подписано, это преобразование преобразует отрицательные значения char в большие значения unsigned int (например, fffffff5). Если вы хотите обрабатывать значения байтов как значения без знака и просто равны нулю при преобразовании в unsigned int, вы должны использовать unsigned char для pixel_data, или передавать через unsigned char или использовать операцию маскировки после продвижения по службе.

например.

printf(" 0x%x ", (unsigned)(unsigned char)pixel_data[0] );

или

printf(" 0x%x ", (unsigned)pixel_data[0] & 0xffU );

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

Используйте %hhx

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

Ответ 5

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