Maison >développement back-end >C++ >Pourquoi `printf` affiche-t-il une sortie inattendue lors de l'impression d'octets hexadécimaux à partir d'un vecteur de caractères ?

Pourquoi `printf` affiche-t-il une sortie inattendue lors de l'impression d'octets hexadécimaux à partir d'un vecteur de caractères ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-07 07:04:111003parcourir

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

Sortie inattendue de printf lors de l'impression d'octets hexadécimaux

Lorsque vous travaillez avec un vecteur de caractères (pixel_data), imprimez un seul octet en tant que valeur hexadécimale (printf(" 0x %1x ", pixel_data[0])) peut produire de manière inattendue un entier de quatre octets (0xfffffff5) au lieu de la valeur prévue (0xf5).

Cause du problème

Printf attend généralement un paramètre entier non signé pour le modificateur %x. Cependant, un char est promu en int lorsqu'il est transmis à une fonction varargs comme printf. Cette promotion entraîne l'impression d'octets supplémentaires.

Résolution du problème

Pour garantir des résultats prévisibles, convertissez explicitement le caractère en un entier non signé :

printf(" 0x%1x ", (unsigned)pixel_data[0]);

Considérations pour Types de variables

  • Définissez pixel_data comme caractère non signé pour traiter les octets comme non signés valeurs.
  • Vous pouvez également convertir en char non signé dans l'instruction printf :
printf(" 0x%x ", (unsigned)(unsigned char)pixel_data[0]);
  • Utilisez une opération de masquage pour appliquer une extension à zéro lors de la conversion en entier non signé :
printf(" 0x%x ", (unsigned)pixel_data[0] & 0xffU);

Comprendre la largeur du champ

Le champ %1x width spécifie le nombre minimum de chiffres à afficher. Cependant, son utilité est limitée dans ce contexte car au moins un chiffre est toujours nécessaire.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn