Je débogage du code (non écrit par moi-même) et j'ai un index INT code> code> étant imprimé avec est-ce ok / y a-t-il quelque chose autour de cela? P> % # x code> dans une fonction de printf. De ma compréhension
% # x code> est un entier supérieur em> non signé em> hexadécimal. P>
3 Réponses :
Le # code> combiné avec
x code> sera imprimé
0x code> avant d'imprimer votre
index code> valeur en majuscule format hexadécimal.
Il a l'air totalement d'accord et sans autre explication, nous ne pouvions pas vous donner un "chemin autour de ça". P>
Re "il a l'air totalement d'accord": C 2018 7.21.6.1 9 dit que le comportement n'est pas défini. Re "Nous ne pouvions pas vous donner un" chemin autour de cela "": casting to non signé INT code> est un moyen de le contourner.
Le spécificateur de conversion de CPPreference : P>
dans la mise en œuvre alternative Donc, il semblerait que cela soit intentionnel par l'auteur. P>
Si vous demandez à la place à propos de la partie non signée em> de cela, Sinon, tout va bien d'avoir une valeur signée comme entrée - elle sera simplement réinterprétée comme non signée. Sauf si c'est le bogue que vous avez identifié dans votre programme! ;) p> # code> indique que la conversion alternative em> doit être utilisée. P>
0x code> ou
0x code> est préfixé aux résultats si
La valeur convertie est non nulle. P>
blockQuote>
% x code> est toujours em> non signé. Si vous avez une valeur signée et que vous souhaitez que votre valeur hexagone soit préfixée avec un signe négatif pour les négatifs, vous devrez rouler votre propre. P>
Re "Tout va bien d'avoir une valeur signée comme entrée": C 2018 7.21.6.1 9 dit que le comportement n'est indéfini.
de ma compréhension% # x est un entier hexadécimal majuscule non signé. p> blockQuote>
Ceci est correct, par la norme C, l'argument correspondant à
% # x code> doit être un
non signé INT code> et le comportement de transmettre un
int < / code> n'est pas techniquement non défini par la norme C, conformément à C 2018 7.21.6.1 8 (qui dit
x code> est pour
non signé INT code>) et 9 ("si un argument N'est-ce pas le type correct pour la spécification de conversion correspondante, le comportement est indéfini. ") P>
Dans la pratique, peu, si des implémentations C de C se plaindre de cela ou se comportent autre que, en vigueur, réinterpréter les bits du
int code> en tant que
non signé INT code>. p>
est-ce ok / y a-t-il quelque chose autour de cela? P> blockQuote>
Pour rendre le code pédantiquement correct, lancez l'argument sur
non signé INT code>. P>
Le code est testant pour vérifier que index code> répond à une exigence de longueur minimale et dans les cas où il ne le fait pas, imprime un message d'erreur et l'index, formaté comme
% # x code> . Donc, je suppose que l'index a été défini comme
int code> dans le cas (probablement rare) que l'index est une valeur négative. Mais cela signifierait qu'une valeur signée comme entrée pour
% # x code> est indéfinie comme vous avez dit ... Désolé, probablement ma faute de ne pas avoir mis suffisamment d'informations dans la description de la question, on m'a dit le code Je travaille avec c'est sensible donc je ne voulais pas poster trop d'informations.