Verstehen der unerwarteten Ausgabe von printf beim Drucken eines Bytes als Hexadezimal
Bei der Arbeit mit Vektordatentypen wie pixel_data, die char-Elemente enthalten, kommt es häufig dazu Beim Versuch, ein einzelnes Byte im Hexadezimalformat zu drucken, kann es zu unerwarteten Ergebnissen kommen. Insbesondere könnte das Drucken von pixel_data[0] mit printf(" 0x%1x ", pixel_data[0] ) 0xfffffff5 anstelle des erwarteten 0xf5 ergeben.
Dieses Verhalten ergibt sich aus einer Eigenschaft von printf, wo der %x-Modifikator erwartet als Argument eine ganze Zahl ohne Vorzeichen. Daher wird der char-Wert, der bei der Bereitstellung an eine varargs-Funktion normalerweise zu einer Ganzzahl heraufgestuft wird, von printf als int behandelt.
Um zuverlässige Ergebnisse zu erhalten, wird eine explizite Umwandlung in einen vorzeichenlosen int-Wert empfohlen :
printf(" 0x%1x ", (unsigned)pixel_data[0] );
Außerdem ist eine Feldbreite von eins möglicherweise nicht ideal, da sie eine Mindestanzahl der anzuzeigenden Ziffern angibt und dies immer mindestens eine Ziffer sein wird verwendet.
Wenn char auf Ihrem System als vorzeichenbehafteter Typ behandelt wird, kann die Konvertierung zur Generierung großer vorzeichenloser int-Werte (z. B. fffffff5) für negative char-Werte führen. Um sicherzustellen, dass Bytewerte als vorzeichenlos behandelt werden, verwenden Sie unsigned char für pixel_data, wandeln Sie es über unsigned char um oder verwenden Sie eine Maskierungsoperation:
printf(" 0x%x ", (unsigned)(unsigned char)pixel_data[0] ); printf(" 0x%x ", (unsigned)pixel_data[0] & 0xffU );
Das obige ist der detaillierte Inhalt vonWarum zeigt „printf' beim Drucken eines Bytes eine unerwartete Hex-Ausgabe an?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!