การส่ง uint_64_t ไปยัง va_list ไม่ถูกต้อง
ฉันกำลังเขียน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 นี่คือพฤติกรรมมาตรฐานบางอย่างที่ฉันหายไปหรือฉันทำอะไรผิดหรือเปล่า?
คำตอบ
หาก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_t
uint64_t