Passage incorrect de uint_64_t à va_list

Jan 05 2021

J'écris une printffonction personnalisée et un uint64_tsemble être mal passé à va_list:

Point problématique:

printf("Number is %C, and the next one is %C", 0xff00ffb7, 0xffffffff);

Une partie de mon printfimplémentation qui produit le résultat incorrect:

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

Lors du débogage avec gdb, la valeur de numdevient 0xffffffffff00ffb7plutôt que 0xff00ffb7ce que j'attends, et pour le suivant %C numdevient 0. Est-ce un comportement standard qui me manque ou est-ce que je fais quelque chose de mal?

Réponses

4 chux-ReinstateMonica Jan 05 2021 at 02:39

Si 0xff00ffb7est censé être un uint64_tpour une fonction variadique, lancez-le.

printf("Number is %C", (uint64_t) 0xff00ffb7);

0xff00ffb7, en tant que constante entière, a le type de int, unsigned, long, unsigned long, long longou unsigned long long,: la première à laquelle elle "correspond". Avec 32 bits int/unsigned, 0xff00ffb7serait unsignedet probablement la source des problèmes d'OP.

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

Ajouter Lou LLà une constante n'est pas une bonne idée pour s'assurer qu'une constante l'est uint64_t. Les deux peuvent correspondre ( LLsouvent), mais ces suffixes ne garantissent pas ce type.

L'utilisation de UINT64_C(0xff00ffb7)formes une constante de type uint_least64_tqui est certainement la même que uint64_tsur les machines qui ont uint64_t.