Вы, вероятно, получить доброкачественную форму неопределенного поведения, потому что модификатор %x
ожидает unsigned int
параметра и char
обычно будет повышен до int
при передаче в переменной длину функции.
Вы должны явно привести символ к 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);
Смотрите также: http://stackoverflow.com/questions/3512749/memcpy-adds-ff-ff-ff-to-the-beginning-of-a-byte –