Passaggio errato di uint_64_t a va_list

Jan 05 2021

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

4 chux-ReinstateMonica Jan 05 2021 at 02:39

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.