Quel est le but de l'h et hh modificateurs pour printf?

Côté de %hn et %hhn (où le h ou hh spécifie la taille de la -pointu à objet), ce qui est le point de la h et hh des modificateurs pour printf les spécificateurs de format?

Pour défaut des promotions qui sont requis par la norme à appliquer pour les variadic fonctions, il est impossible de passer des arguments de type char ou short (ou tout signé/non signé variantes de celle-ci) à printf.

Selon 7.19.6.1(7), le h modificateur:

Spécifie qu'une suite de d, i, o, u, x ou x indicateur de conversion s'applique à un
short int ou unsigned short int argument (l'argument ne
ont été promus en fonction de l'entier des promotions, mais sa valeur est
être converti short int ou unsigned short int avant d'imprimer);
ou qu'une suite de n indicateur de conversion s'applique à un pointeur sur un court
argument int.

Si l'argument est en fait de type short ou unsigned short, puis la promotion de int suivie d'une conversion en arrière pour short ou unsigned short donnera le même valeur que la promotion de int sans aucune conversion. Ainsi, pour les arguments de type short ou unsigned short, %d, %u, etc. devrait donner des résultats identiques à %hd, %hu, etc. (et de même pour la char types et hh).

Aussi loin que je peux dire, la seule situation où le h ou hh modificateur pourrait éventuellement être utile lorsque l'argument passé un int en dehors de la plage de short ou unsigned short, par exemple

printf("%hu", 0x10000);

mais ma compréhension est que passer du mauvais type, comme il en résulte un comportement indéfini de toute façon, de sorte que vous ne pouvait pas s'attendre à imprimer 0.

Un cas réel que j'ai vu est un code comme ceci:

char c = 0xf0;
printf("%hhx", c);

où l'auteur s'attend à imprimer f0 en dépit de la mise en œuvre ayant une plaine char type signé (dans ce cas, printf("%x", c) serait d'imprimer fffffff0 ou similaire). Mais est-ce une attente justifiée?

(Note: Ce qui se passe est que le type d'origine a été char, qui sera promu à int et converti en unsigned char au lieu de char, et donc de changer la valeur qui sera imprimé. Mais la norme spécifier ce problème, ou est-ce un détail d'implémentation qui cassé logiciel peut être en s'appuyant sur?)

  • La grande question, et encore plus de vous voir être impitoyablement pointilleux avec la réponse.
  • Très belle question. Je suis en train de travailler sur la forme d'un i/o de la mise en œuvre dès maintenant et tout en essayant de suivre la norme, je suis tombé sur la même question. Merci pour l'affichage
InformationsquelleAutor R.. | 2011-01-03