web-dev-qa-db-fra.com

Pourquoi le spécificateur de format pour uint8_t et uint16_t est-il le même (% u)?

Je n'ai trouvé que des questions assez indépendantes en raison des tonnes de résultats à la recherche de printf().

Pourquoi uint8_t Ne spécifie pas sa propre chaîne de format mais tout autre type le fait?

Pour autant que je comprends printf(), il doit connaître la longueur des paramètres fournis pour pouvoir analyser la liste des arguments variables.

Comme uint8_t Et uint16_t Utilisent le même spécificateur de format %u, Comment printf() "sait" combien d'octets traiter? Ou y a-t-il en quelque sorte un cast implicite vers uint16_t Impliqué lors de la fourniture de uint8_t?

Peut-être que je manque quelque chose d'évident.

9
Rev1.0

printf() est une fonction variadique. Ses arguments facultatifs (et uniquement ceux) sont promus selon les promotions d'arguments par défaut (6.5.2.2. P6).

Puisque vous demandez des nombres entiers, les promotions entières sont appliquées dans ce cas, et les types que vous mentionnez sont promus int. ( et pas unsigned int parce que C)

Si tu utilises "%u" dans printf (), et passez-lui un uint16_t variable, puis la fonction la convertit en int, puis en unsigned int (car vous l'avez demandé avec% u), puis l'imprime.

7
2501

Parce que% u signifie "non signé", il peut très bien être uint64_t et dépend de l'architecture. Selon man 3 printf, vous pouvez utiliser le modificateur de longueur pour obtenir le comportement recherché, c'est-à-dire% hu (uint16_t) et% hhu (uint8_t).

13
wick