Du bist wahrscheinlich eine gutartige Form von undefinierten Verhalten bekommen, weil der %x
Modifikator einen unsigned int
Parameter und ein char
erwartet wird in der Regel auf ein int
gefördert werden, wenn sie ein geben varargs Funktion.
Sie sollten explizit die Zeichen auf eine unsigned int
werfen vorhersehbare Ergebnisse zu erhalten:
printf(" 0x%1x ", (unsigned)pixel_data[0]);
Beachten Sie, dass eine Feldbreite von einem nicht sehr nützlich ist. Es gibt lediglich die Mindestanzahl an Ziffern an, die angezeigt werden sollen, und in jedem Fall wird mindestens eine Ziffer benötigt.
Wenn char
auf Ihrer Plattform dann wird diese Umwandlung konvertiert negative char
Werte zu großen unsigned int
Werten (z fffffff5
) signiert ist. Wenn Sie Byte-Werte als vorzeichenlose Werte behandeln und bei der Konvertierung in unsigned int
einfach null eingeben möchten, sollten Sie unsigned char
für pixel_data
verwenden oder über unsigned char
umwandeln oder nach dem Hochstufen einen Maskierungsvorgang verwenden.
z.B.
printf(" 0x%x ", (unsigned)(unsigned char)pixel_data[0]);
oder
printf(" 0x%x ", (unsigned)pixel_data[0] & 0xffU);
Siehe auch: http://stackoverflow.com/questions/3512749/memcpy-adds-ff-ff-ff-to-the-beginning-of-a-byte –