Pemberian uint_64_t ke va_list salah
Saya menulis printf
fungsi kustom dan uint64_t
tampaknya diteruskan dengan tidak benar ke va_list
:
Poin bermasalah:
printf("Number is %C, and the next one is %C", 0xff00ffb7, 0xffffffff);
Bagian dari printf
implementasi saya yang menghasilkan hasil yang salah:
format++;
uint64_t num = va_arg(parameters, uint64_t);
Saat men-debug dengan gdb, nilai num
menjadi 0xffffffffff00ffb7
daripada 0xff00ffb7
yang saya harapkan, dan untuk selanjutnya %C
num
menjadi 0. Apakah ini beberapa perilaku standar yang saya lewatkan atau apakah saya melakukan sesuatu yang salah?
Jawaban
Jika 0xff00ffb7
dimaksudkan untuk menjadi uint64_t
fungsi variadic, cast itu.
printf("Number is %C", (uint64_t) 0xff00ffb7);
0xff00ffb7
, sebagai konstanta integer, memiliki jenis int, unsigned, long, unsigned long, long long
atau unsigned long long
,: yang pertama "cocok". Dengan 32-bit int/unsigned
, kemungkinan besar 0xff00ffb7
akan menjadi unsigned
sumber masalah OP.
Menambahkan u
konstanta adalah ide yang baik untuk memastikannya adalah jenis yang tidak ditandatangani.
Menambahkan L
atau LL
ke konstanta bukanlah ide yang baik untuk memastikan sebuah konstanta adalah uint64_t
. Keduanya mungkin cocok ( LL
sering kali), tetapi sufiks ini tidak menjamin jenis itu.
Menggunakan UINT64_C(0xff00ffb7)
bentuk-bentuk konstanta jenis uint_least64_t
yang tentunya sama dengan uint64_t
pada mesin yang memilikinya uint64_t
.