Passaggio errato di uint_64_t a va_list
Sto scrivendo una printffunzione personalizzata e uint64_tsembra 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 printfimplementazione che produce il risultato errato:
format++;
uint64_t num = va_arg(parameters, uint64_t);
Durante il debug con gdb il valore di numdiventa 0xffffffffff00ffb7piuttosto 0xff00ffb7che quello che mi aspetto, e per il prossimo %C numdiventa 0. È questo un comportamento standard che mi manca o sto facendo qualcosa di sbagliato?
Risposte
Se 0xff00ffb7si intende uint64_tper una funzione variadica, lanciarlo.
printf("Number is %C", (uint64_t) 0xff00ffb7);
0xff00ffb7, come costante intera, ha il tipo int, unsigned, long, unsigned long, long longo unsigned long long,: il primo che "si adatta". Con 32 bit int/unsigned, 0xff00ffb7sarebbe unsignede probabilmente la fonte dei problemi di OP.
Aggiungere ua una costante è una buona idea per assicurarsi che sia un tipo non firmato.
Aggiungere Lo LLad una costante non è una buona idea per assicurare che una costante lo sia uint64_t. Entrambi potrebbero corrispondere ( LLspesso lo faranno), ma questi suffissi non garantiscono quel tipo.
Utilizzando UINT64_C(0xff00ffb7)forme una costante di tipo uint_least64_tche è certamente la stessa uint64_tdelle macchine che hanno uint64_t.