3 votes

Passer incorrectement uint_64_t à va_list

Je suis en train d'écrire une fonction printf personnalisée et un uint64_t semble être passé incorrectement à va_list:

Point problématique:

printf("Le nombre est %C, et le suivant est %C", 0xff00ffb7, 0xffffffff);

Partie de mon implémentation de printf qui produit le résultat incorrect:

format++;
uint64_t num = va_arg(parameters, uint64_t);

Lors du débogage avec gdb, la valeur de num devient 0xffffffffff00ffb7 plutôt que 0xff00ffb7 que j'attends, et pour le prochain %C num devient 0. Est-ce un comportement standard que je rate ou est-ce que je fais quelque chose de mal?

4voto

chux Points 13185

Si 0xff00ffb7 est censé être un uint64_t pour une fonction variadique, effectuez une conversion.

printf("Le nombre est %C", (uint64_t) 0xff00ffb7);

0xff00ffb7, en tant que constante entière, a le type de int, unsigned, long, unsigned long, long long ou unsigned long long : le premier dans lequel il "s'adapte". Avec un int/unsigned sur 32 bits, 0xff00ffb7 serait unsigned et probablement à l'origine du problème de l'OP.

Ajouter un u à une constante est une bonne idée pour s'assurer qu'il s'agit d'un type non signé.

Ajouter un L ou un LL à une constante n'est pas une bonne idée pour assurer qu'une constante est de type uint64_t. L'un ou l'autre pourrait correspondre (le LL correspond souvent), mais ces suffixes ne garantissent pas ce type.

Utiliser les formes UINT64_C(0xff00ffb7) forme une constante de type uint_least64_t qui est certainement le même que uint64_t sur les machines qui ont uint64_t.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X