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] );
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 );
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!