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

Était-ce utile?

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 avec d, i, o, u, x, types de X
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top