औपचारिक रूप से, अपने कार्यक्रम दर्शाती अपरिभाषित व्यवहार: %x
प्रारूप विनिर्देश प्रकार unsigned int
की एक बहस की उम्मीद है, लेकिन आप एक से गुजर रहे हैं int
, जैसा कि नीचे बताया गया है (टोपी टिप @ आर)। यह आधुनिक दो की पूरक मशीनों पर अभ्यास में हानिकारक है, क्योंकि int और हस्ताक्षरित संगत बिट लेआउट हैं। लेकिन फिर, तकनीकी रूप से, यह अनिर्धारित व्यवहार है और printf("%x\n", (unsigned)byte);
में इसे ठीक करना एक अच्छा विचार होगा।
विविधता कार्यों को पैरामीटर पारित करने के नियम बताते हैं कि इंट से छोटे इंटीग्रल प्रकार int को प्रोत्साहित करते हैं। अन्यथा, printf
कैसे %x
देखकर, चाहे एक बाइट या चार बाइट स्टैक से पकड़ लेना है?
5.2.2p7: मानक से
जब किसी दिए गए तर्क, तर्क इस तरह से कि प्राप्त समारोह va_arg लागू द्वारा तर्क का मान प्राप्त कर सकते हैं में पारित हो जाता है के लिए कोई पैरामीटर है (18.10)...
यदि तर्क में अभिन्न या गणना प्रकार है जो अभिन्न प्रचार (4.5),
या फ़्लोटिंग पॉइंट प्रकार के अधीन है जो फ़्लोटिंग पॉइंट पदोन्नति (4.6),
के अधीन है, तो तर्क का मान कॉल से पहले प्रचारित प्रकार में परिवर्तित हो जाता है।
इस प्रकार से आपका char
एक int
में बदल जाता है है। यह निर्दिष्ट नहीं है कि char
हस्ताक्षरित या हस्ताक्षरित है, लेकिन स्पष्ट रूप से, प्लेटफॉर्म पर आप इसे एक हस्ताक्षरित प्रकार का उपयोग करते हैं। तो int
पर प्रचारित होने पर यह साइन-विस्तारित हो जाता है। 0xff
(char)-1
है, और 0xffffffff
(int)-1
है।
स्रोत
2013-07-24 21:26:20
google "पूर्णांक पदोन्नति" –
नीचे दिए गए मेरे उत्तर को पढ़ें –
बस एक लिंक मिला [डीपी सी: इंटीजर प्रमोशन] (http://www.idryman.org/blog/2012/11/21/integer-promotion/) समझाएं मैं क्या कह रहा था। इसका कार्यान्वयन निर्भर है। –