Maison > développement back-end > C++ > Pourquoi `printf` affiche-t-il une sortie hexadécimale inattendue lors de l'impression d'un octet ?

Pourquoi `printf` affiche-t-il une sortie hexadécimale inattendue lors de l'impression d'un octet ?

Linda Hamilton
Libérer: 2024-12-20 13:09:13
original
879 Les gens l'ont consulté

Why Does `printf` Show Unexpected Hex Output When Printing a Byte?

Comprendre la sortie inattendue de printf lors de l'impression d'un octet au format hexadécimal

Lorsque vous travaillez avec des types de données vectorielles comme pixel_data contenant des éléments char, il est courant de vous rencontrez des résultats inattendus lorsque vous tentez d'imprimer un seul octet au format hexadécimal. Plus précisément, l'impression de pixel_data[0] à l'aide de printf(" 0x%1x ", pixel_data[0] ) pourrait donner 0xfffffff5 au lieu du 0xf5 prévu.

Ce comportement découle d'une caractéristique de printf, où le modificateur %x anticipe un entier non signé comme argument. Par conséquent, la valeur char, qui est généralement promue en entier lorsqu'elle est fournie à une fonction varargs, est traitée comme un int par printf.

Pour obtenir des résultats fiables, une conversion explicite en un int non signé est recommandée :

printf(" 0x%1x ", (unsigned)pixel_data[0] );
Copier après la connexion

De plus, une largeur de champ de un n'est peut-être pas idéale, car elle spécifie un nombre minimum de chiffres à afficher, et au moins un chiffre sera toujours utilisé.

Si char sur votre système est géré comme un type signé, la conversion peut entraîner la génération de grandes valeurs int non signées (par exemple, fffffff5) pour les valeurs char négatives. Pour garantir que les valeurs d'octets sont traitées comme non signées, utilisez un caractère non signé pour pixel_data, convertissez via un caractère non signé ou utilisez une opération de masquage :

printf(" 0x%x ", (unsigned)(unsigned char)pixel_data[0] );
printf(" 0x%x ", (unsigned)pixel_data[0] & 0xffU );
Copier après la connexion

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