Heim > Backend-Entwicklung > C++ > Warum zeigt „printf' beim Drucken von Hexadezimalbytes aus einem Zeichenvektor eine unerwartete Ausgabe an?

Warum zeigt „printf' beim Drucken von Hexadezimalbytes aus einem Zeichenvektor eine unerwartete Ausgabe an?

Barbara Streisand
Freigeben: 2024-12-07 07:04:11
Original
1002 Leute haben es durchsucht

Why Does `printf` Show Unexpected Output When Printing Hexadecimal Bytes from a Char Vector?

Unerwartete Ausgabe von printf beim Drucken hexadezimaler Bytes

Beim Arbeiten mit einem Vektor von Zeichen (pixel_data) wird ein einzelnes Byte als Hexadezimalwert gedruckt (printf(" 0x %1x ", pixel_data[0])) kann unerwartet eine Vier-Byte-Ganzzahl (0xfffffff5) erzeugen der beabsichtigte Wert (0xf5).

Ursache des Problems

Printf erwartet normalerweise einen vorzeichenlosen Ganzzahlparameter für den %x-Modifikator. Allerdings wird ein Zeichen zu einem int heraufgestuft, wenn es an eine varargs-Funktion wie printf übergeben wird. Diese Heraufstufung führt zum Drucken zusätzlicher Bytes.

Beheben des Problems

Um vorhersehbare Ergebnisse zu gewährleisten, wandeln Sie das Zeichen explizit in ein vorzeichenloses int um:

printf(" 0x%1x ", (unsigned)pixel_data[0]);
Nach dem Login kopieren

Überlegungen für Variablentypen

  • Definieren Sie pixel_data als vorzeichenloses Zeichen, um die Bytes als vorzeichenlos zu behandeln Werte.
  • Alternativ können Sie in der printf-Anweisung in ein vorzeichenloses Zeichen umwandeln:
printf(" 0x%x ", (unsigned)(unsigned char)pixel_data[0]);
Nach dem Login kopieren
  • Verwenden Sie eine Maskierungsoperation, um bei der Konvertierung in ein vorzeichenloses int eine Nullerweiterung vorzunehmen:
printf(" 0x%x ", (unsigned)pixel_data[0] & 0xffU);
Nach dem Login kopieren

Feldbreite verstehen

Die %1x Feldbreite gibt die Mindestanzahl der anzuzeigenden Ziffern an. Allerdings ist der Nutzen in diesem Zusammenhang begrenzt, da immer mindestens eine Ziffer benötigt wird.

Das obige ist der detaillierte Inhalt vonWarum zeigt „printf' beim Drucken von Hexadezimalbytes aus einem Zeichenvektor eine unerwartete Ausgabe an?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage