Ответ 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 );