C'est plus une question curieuse qu'une question importante, mais pourquoi lors de l'impression hexadécimale comme un nombre à 8 chiffres avec des zéros non significatifs, cela %#08X
n'affiche- t-il pas le même résultat que 0x%08X
?
Lorsque j'essaie d'utiliser l'ancien, l' 08
indicateur de mise en forme est supprimé et cela ne fonctionne pas avec 8
.
Encore une fois, j'étais simplement curieux.
0x%.8X
? Cela va conduire avec des zéros de remplissage. (ce0x
n'est qu'un préambule, mais vous en êtes probablement déjà conscient).Réponses:
La
#
partie vous donne un0x
dans la chaîne de sortie. Le0
et lex
compte contre vos "8" caractères répertoriés dans la08
partie. Vous devez demander 10 caractères si vous voulez que ce soit le même.Changer également la casse de
x
, affecte la casse des caractères sortis.la source
14F
?i = 0;
, les versions utilisant%#
n'incluront pas le0x
préfixe.Le "0x" compte dans le compte de huit caractères. Vous avez besoin
"%#010x"
.Notez que
#
n'ajoute pas le 0x à 0 - le résultat sera0000000000
- donc vous devriez probablement l'utiliser de"0x%08x"
toute façon.la source
La
%#08X
conversion doit précéder la valeur avec0X
; qui est exigé par la norme. Il n'y a aucune preuve dans la norme que le#
devrait modifier le comportement de la08
partie de la spécification sauf que le0X
préfixe est compté comme faisant partie de la longueur (vous pourriez donc vouloir / avoir besoin de l'utiliser%#010X
. Si, comme moi, vous aimez votre hexa présenté comme0x1234CDEF
, alors vous devez utiliser0x%08X
pour obtenir le résultat souhaité. Vous pouvez utiliser%#.8X
et cela devrait également insérer les zéros non significatifs.Essayez des variantes du code suivant:
Sur une machine RHEL 5, ainsi que sur Mac OS X (10.7.5), le résultat était:
Je suis un peu surpris du traitement de 0; Je ne sais pas pourquoi le
0X
préfixe 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.
(Je souligne.)
Notez que l'utilisation
%#X
utilisera des lettres majuscules pour les chiffres hexadécimaux et0X
comme préfixe; using%#x
utilisera des lettres minuscules pour les chiffres hexadécimaux et0x
comme préfixe. Si vous préférez0x
que le préfixe et les lettres majuscules, vous devez coder la0x
séparément:0x%X
. D'autres modificateurs de format peuvent être ajoutés au besoin, bien sûr.Pour imprimer des adresses, utilisez l'en-
<inttypes.h>
tête et leuintptr_t
type et laPRIXPTR
macro de format:Exemple de sortie:
Choisissez votre poison sur la longueur - je trouve qu'une précision de 12 fonctionne bien pour les adresses sur un Mac exécutant macOS. Combiné avec le
.
pour spécifier la précision minimale (chiffres), il formate les adresses de manière fiable. Si vous définissez la précision sur 16, les 4 chiffres supplémentaires sont toujours 0 selon mon expérience sur le Mac, mais il y a certainement un cas à utiliser pour utiliser 16 au lieu de 12 dans un code 64 bits portable (mais vous utiliseriez 8 pour Code 32 bits).la source