0
votes

Pourquoi un INT serait-il formaté comme% # x dans une fonction Printf?

Je débogage du code (non écrit par moi-même) et j'ai un index INT étant imprimé avec % # x dans une fonction de printf. De ma compréhension % # x est un entier supérieur non signé hexadécimal.

est-ce ok / y a-t-il quelque chose autour de cela?


0 commentaires

3 Réponses :


0
votes

Le # combiné avec x sera imprimé 0x avant d'imprimer votre index 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".


1 commentaires

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 est un moyen de le contourner.



2
votes

Le spécificateur de conversion # indique que la conversion alternative doit être utilisée.

de CPPreference :

dans la mise en œuvre alternative 0x ou 0x est préfixé aux résultats si La valeur convertie est non nulle.

Donc, il semblerait que cela soit intentionnel par l'auteur.

Si vous demandez à la place à propos de la partie non signée de cela, % x est toujours 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.

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


1 commentaires

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.



0
votes

de ma compréhension% # x est un entier hexadécimal majuscule non signé.

Ceci est correct, par la norme C, l'argument correspondant à % # x doit être un non signé INT 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 est pour non signé INT ) et 9 ("si un argument N'est-ce pas le type correct pour la spécification de conversion correspondante, le comportement est indéfini. ")

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 en tant que non signé INT .

est-ce ok / y a-t-il quelque chose autour de cela?

Pour rendre le code pédantiquement correct, lancez l'argument sur non signé INT .


1 commentaires

Le code est testant pour vérifier que index 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 . Donc, je suppose que l'index a été défini comme int 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 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.