Вы, вероятно, получаете доброкачественную форму неопределенного поведения, потому что модификатор %x
ожидает параметр unsigned int
, а char
будет обычно повышаться до int
при передаче в varargs function.
Вы должны явно привести символ к 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 );