การส่ง 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_tuint64_t