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
।
जोड़ u
एक निरंतर करने के लिए एक है अच्छा यह कुछ अहस्ताक्षरित प्रकार है बीमा करने के लिए विचार।
स्थिरांक का बीमा कराना L
या LL
स्थिरांक लगाना एक अच्छा विचार नहीं है uint64_t
। या तो मेल कर सकते हैं ( LL
अक्सर), लेकिन ये प्रत्यय उस प्रकार की गारंटी नहीं देते हैं।
UINT64_C(0xff00ffb7)
एक प्रकार के रूपों का उपयोग करना uint_least64_t
जो निश्चित रूप uint64_t
से मशीनों पर समान है uint64_t
।