การส่ง uint_64_t ไปยัง va_list ไม่ถูกต้อง

Jan 05 2021

ฉันกำลังเขียนprintfฟังก์ชันที่กำหนดเองและuint64_tดูเหมือนว่าจะส่งผ่านไปยังva_list:

จุดที่เป็นปัญหา:

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

ส่วนหนึ่งของprintfการใช้งานของฉันที่ให้ผลลัพธ์ที่ไม่ถูกต้อง:

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

เมื่อดีบักด้วย gdb ค่าของnumจะกลายเป็น0xffffffffff00ffb7มากกว่า0xff00ffb7ที่ฉันคาดหวังและถัดไป%C numจะกลายเป็น 0 นี่คือพฤติกรรมมาตรฐานบางอย่างที่ฉันหายไปหรือฉันทำอะไรผิดหรือเปล่า?

คำตอบ

4 chux-ReinstateMonica Jan 05 2021 at 02:39

หาก0xff00ffb7หมายถึงuint64_tเป็นฟังก์ชันตัวแปรให้แคสต์

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

0xff00ffb7ในฐานะที่เป็นค่าคงที่จำนวนเต็มมีประเภทint, unsigned, long, unsigned long, long longหรือunsigned long long: ค่าแรกที่ "พอดี" กับ 32 บิตint/unsigned, 0xff00ffb7จะเป็นunsignedและมีแนวโน้มที่แหล่งที่มาของปัญหาของ OP

การต่อท้ายuค่าคงที่เป็นความคิดที่ดีที่จะประกันว่าเป็นประเภทที่ไม่ได้ลงนาม

ท้ายLหรือจะคงที่ไม่ได้เป็นความคิดที่ดีที่จะประกันคงเป็นLL uint64_tอย่างใดอย่างหนึ่งอาจจะตรงกับ ( LLมักจะ) แต่ต่อท้ายเหล่านี้ไม่ได้รับประกันประเภทนั้น

โดยใช้UINT64_C(0xff00ffb7)รูปแบบคงที่ของชนิดuint_least64_tซึ่งเป็นที่แน่นอนเช่นเดียวกับบนเครื่องที่มีuint64_tuint64_t