Pemberian uint_64_t ke va_list salah

Jan 05 2021

Saya menulis printffungsi kustom dan uint64_ttampaknya diteruskan dengan tidak benar ke va_list:

Poin bermasalah:

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

Bagian dari printfimplementasi saya yang menghasilkan hasil yang salah:

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

Saat men-debug dengan gdb, nilai nummenjadi 0xffffffffff00ffb7daripada 0xff00ffb7yang saya harapkan, dan untuk selanjutnya %C nummenjadi 0. Apakah ini beberapa perilaku standar yang saya lewatkan atau apakah saya melakukan sesuatu yang salah?

Jawaban

4 chux-ReinstateMonica Jan 05 2021 at 02:39

Jika 0xff00ffb7dimaksudkan untuk menjadi uint64_tfungsi variadic, cast itu.

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

0xff00ffb7, sebagai konstanta integer, memiliki jenis int, unsigned, long, unsigned long, long longatau unsigned long long,: yang pertama "cocok". Dengan 32-bit int/unsigned, kemungkinan besar 0xff00ffb7akan menjadi unsignedsumber masalah OP.

Menambahkan ukonstanta adalah ide yang baik untuk memastikannya adalah jenis yang tidak ditandatangani.

Menambahkan Latau LLke konstanta bukanlah ide yang baik untuk memastikan sebuah konstanta adalah uint64_t. Keduanya mungkin cocok ( LLsering kali), tetapi sufiks ini tidak menjamin jenis itu.

Menggunakan UINT64_C(0xff00ffb7)bentuk-bentuk konstanta jenis uint_least64_tyang tentunya sama dengan uint64_tpada mesin yang memilikinya uint64_t.