format printf () pour hexadécimal

C’est plus une question curieuse qu’une question importante, mais pourquoi lors de l’impression hexadécimale sous la forme d’un nombre à 8 chiffres avec des zéros non %#08X , est-ce que %#08X n’affiche pas le même résultat que 0x%08X ?

Lorsque j’essaie d’utiliser le premier, l’indicateur de formatage 08 est supprimé et il ne fonctionne pas avec seulement 8 .

Encore une fois j’étais juste curieux.

La partie # vous donne un 0x dans la chaîne de sortie. Le 0 et le x comptent avec vos “8” caractères répertoriés dans la partie 08 . Vous devez demander 10 caractères si vous voulez que ce soit la même chose.

 int i = 7; printf("%#010x\n", i); // gives 0x00000007 printf("0x%08x\n", i); // gives 0x00000007 printf("%#08x\n", i); // gives 0x000007 

Changer également la casse de x , affecte le casse des caractères sortis.

 printf("%04x", 4779); // gives 12ab printf("%04X", 4779); // gives 12AB 

Le “0x” compte pour le compte de huit caractères. Vous avez besoin de "%#010x" .

Notez que # n’ajoute pas le 0x à 0 – le résultat sera 0000000000 – de sorte que vous devriez probablement utiliser "0x%08x" toute façon.

La conversion %#08X doit précéder la valeur avec 0X ; c’est requirejs par la norme. Il n’y a aucune preuve dans la norme que le # modifie le comportement de la partie 08 de la spécification, sauf que le préfixe 0X fait partie de la longueur (vous pouvez donc vouloir / utiliser %#010X . Si, comme moi, vous aimez votre hex présenté comme 0x1234CDEF , alors vous devez utiliser 0x%08X pour obtenir le résultat souhaité.Vous pouvez utiliser %#.8X et cela devrait également insérer les zéros en tête.

Essayez des variantes du code suivant:

 #include  int main(void) { int j = 0; printf("0x%.8X = %#08X = %#.8X = %#010x\n", j, j, j, j); for (int i = 0; i < 8; i++) { j = (j << 4) | (i + 6); printf("0x%.8X = %#08X = %#.8X = %#010x\n", j, j, j, j); } return(0); } 

Sur une machine RHEL 5, ainsi que sur Mac OS X (10.7.5), la sortie était la suivante:

 0x00000000 = 00000000 = 00000000 = 0000000000 0x00000006 = 0X000006 = 0X00000006 = 0x00000006 0x00000067 = 0X000067 = 0X00000067 = 0x00000067 0x00000678 = 0X000678 = 0X00000678 = 0x00000678 0x00006789 = 0X006789 = 0X00006789 = 0x00006789 0x0006789A = 0X06789A = 0X0006789A = 0x0006789a 0x006789AB = 0X6789AB = 0X006789AB = 0x006789ab 0x06789ABC = 0X6789ABC = 0X06789ABC = 0x06789abc 0x6789ABCD = 0X6789ABCD = 0X6789ABCD = 0x6789abcd 

Je suis un peu surpris du traitement de 0; Je ne comprends pas pourquoi le préfixe 0X est omis, mais avec deux systèmes distincts, il doit être standard. Cela confirme mes préjugés contre l'option # .


Le traitement de zéro est conforme à la norme.

ISO / IEC 9899: 2011 §7.21.6.1 La fonction fprintf

Les caractères de drapeau et leur signification sont:
...
# Le résultat est converti en un "formulaire alternatif". ... Pour la conversion x (ou X ), un résultat différent de zéro a pour préfixe 0x (ou 0X ). ...

(Accentuation ajoutée.)