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