Passage incorrect de uint_64_t à va_list
J'écris une printf
fonction personnalisée et un uint64_t
semble être mal passé à va_list
:
Point problématique:
printf("Number is %C, and the next one is %C", 0xff00ffb7, 0xffffffff);
Une partie de mon printf
implé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 num
devient 0xffffffffff00ffb7
plutôt que 0xff00ffb7
ce que j'attends, et pour le suivant %C
num
devient 0. Est-ce un comportement standard qui me manque ou est-ce que je fais quelque chose de mal?
Réponses
Si 0xff00ffb7
est censé être un uint64_t
pour 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 long
ou unsigned long long
,: la première à laquelle elle "correspond". Avec 32 bits int/unsigned
, 0xff00ffb7
serait unsigned
et 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 L
ou LL
à une constante n'est pas une bonne idée pour s'assurer qu'une constante l'est uint64_t
. Les deux peuvent correspondre ( LL
souvent), mais ces suffixes ne garantissent pas ce type.
L'utilisation de UINT64_C(0xff00ffb7)
formes une constante de type uint_least64_t
qui est certainement la même que uint64_t
sur les machines qui ont uint64_t
.