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
Libérer: 2024-12-07 07:04:11
original
1036 Les gens l'ont consulté

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]);
Copier après la connexion

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]);
Copier après la connexion
  • 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);
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal