question sur spécificateurs de format printf incompatibles
Question
Je viens de regarder à travers la page de manuel pour printf et quelque chose me vint. Je me demandais s'il y a des « avocats linguistiques » ici qui pourrait répondre à une question :-P relativement simple.
Ainsi, le modificateur 't' est défini comme
La conversion entière suivante correspond à un argument de ptrdiff_t.
Alors, quelle est censé se produire si vous combinez cela avec une conversion entier non signé? Il est clair que o, u, x et X ensemble toutes destinées à être interprétées comme des valeurs non signés, tandis que d et i sont signés.
De même, il y a signed / versions non signées pour tous les modificateurs (int / unsigned int, size_t
/ ssize_t
, etc.) à l'exception ptrdiff_t
.
Dans la pratique, rien ne se passe mal depuis des versions non signées de types occupent le même espace que les versions signées. Ainsi, le droit au sujet d'octets se sauté de la pile.
Alors rien de « mauvais » arrive, en effet, en imprime la valeur attendue pour toutes choses testées à l'exception du « INT_MIN
» (en supposant que sizeof(int) == sizeof(ptrdiff_t)
.
printf("%tu %td\n", INT_MIN, INT_MIN);
impressions
2147483648 -2147483648
sur un système 32 bits.
La norme ont une opinion à ce sujet? Je figure la réponse sera « un comportement non défini. » Mais je pensais que je demande;).
La solution
Rien à voir ici. Le code que vous avez écrit est légal.
Juste quelques faits pour expliquer pourquoi:
- tous les types entiers signés ont homologues non signés, avec la même taille / exigences d'alignement
-
ptrdiff_t
est prescrit pour être un type entier signé par la norme. Par conséquent, il a un jumeau non signé. (En fait, la même logique s'applique àsize_t
aussi bien -ssize_t
est pas C, mais POSIX) - la longueur de spécificateur
t
doit travailler avecd
,i
,o
,u
,x
, types deX