Passaggio errato di uint_64_t a va_list
Sto scrivendo una printf
funzione personalizzata e uint64_t
sembra essere passato in modo errato a va_list
:
Punto problematico:
printf("Number is %C, and the next one is %C", 0xff00ffb7, 0xffffffff);
Parte della mia printf
implementazione che produce il risultato errato:
format++;
uint64_t num = va_arg(parameters, uint64_t);
Durante il debug con gdb il valore di num
diventa 0xffffffffff00ffb7
piuttosto 0xff00ffb7
che quello che mi aspetto, e per il prossimo %C
num
diventa 0. È questo un comportamento standard che mi manca o sto facendo qualcosa di sbagliato?
Risposte
Se 0xff00ffb7
si intende uint64_t
per una funzione variadica, lanciarlo.
printf("Number is %C", (uint64_t) 0xff00ffb7);
0xff00ffb7
, come costante intera, ha il tipo int, unsigned, long, unsigned long, long long
o unsigned long long
,: il primo che "si adatta". Con 32 bit int/unsigned
, 0xff00ffb7
sarebbe unsigned
e probabilmente la fonte dei problemi di OP.
Aggiungere u
a una costante è una buona idea per assicurarsi che sia un tipo non firmato.
Aggiungere L
o LL
ad una costante non è una buona idea per assicurare che una costante lo sia uint64_t
. Entrambi potrebbero corrispondere ( LL
spesso lo faranno), ma questi suffissi non garantiscono quel tipo.
Utilizzando UINT64_C(0xff00ffb7)
forme una costante di tipo uint_least64_t
che è certamente la stessa uint64_t
delle macchine che hanno uint64_t
.