2013-07-24 5 views
5
char byte = 0xff; 
printf("%lu\n", sizeof(byte)) // Output is '1' 
printf("%x\n", byte); // Output is 'ffffffff' 

byte का आकार केवल एक बाइट है, तो क्यों printf() व्यवहार करता है जैसे कि वह चार बाइट्स है?प्रिंटफ पैड को 8-बिट चार 32-बिट्स तक क्यों पैड करता है?

+0

google "पूर्णांक पदोन्नति" –

+0

नीचे दिए गए मेरे उत्तर को पढ़ें –

+0

बस एक लिंक मिला [डीपी सी: इंटीजर प्रमोशन] (http://www.idryman.org/blog/2012/11/21/integer-promotion/) समझाएं मैं क्या कह रहा था। इसका कार्यान्वयन निर्भर है। –

उत्तर

14

औपचारिक रूप से, अपने कार्यक्रम दर्शाती अपरिभाषित व्यवहार: %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 है।

+0

क्या आपके पास उन नियमों का मानक संदर्भ है? –

+2

5.2.2p7 जब किसी दिए गए तर्क के लिए कोई पैरामीटर नहीं होता है, तो तर्क इस तरह से पारित किया जाता है कि प्राप्त करने वाला फ़ंक्शन va_arg (18.10) का आह्वान करके तर्क का मान प्राप्त कर सकता है ... यदि तर्क में अभिन्न या गणना प्रकार है यह अभिन्न प्रचार (4.5), या एक फ़्लोटिंग पॉइंट प्रकार के अधीन है जो फ़्लोटिंग पॉइंट प्रोमोशन (4.6) के अधीन है, तर्क का मूल्य कॉल से पहले प्रचारित प्रकार में परिवर्तित हो जाता है। –

+0

मुझे यह मिला, बहुत धन्यवाद –

1

char 8-बिट पर हस्ताक्षर किए गए हैं। "%x\n" प्रारूप एक पूर्णांक मुद्रित करने के लिए कहता है। तो byte का मान एक पूर्णांक तक बढ़ाया गया है। चूंकि char0xff का संदर्भ है, उस संदर्भ में, -1, printf का 8-बिट मान -1 का हेक्स पूर्णांक मान प्रिंट कर रहा है, जो ffffffff है।

+2

इस प्लेटफॉर्म पर, सादा 'char' है एक हस्ताक्षरित 8-बिट मात्रा। सी मानक स्पष्ट रूप से कहता है कि क्या सादा 'char' हस्ताक्षरित है या हस्ताक्षरित है कार्यान्वयन-परिभाषित विस्तार है। –

2

आपने गलत तर्क प्रकार printf पर जाकर अपरिभाषित व्यवहार का आह्वान किया है। %x विनिर्देशक को unsigned int टाइप करने की आवश्यकता है, लेकिन आप एक हस्ताक्षरित int पर (डिफ़ॉल्ट प्रचार के कारण) पास हुए हैं। यह यकीनन मान्य है अगर हस्ताक्षर किए int तर्क के मान गैर नकारात्मक है, लेकिन आपके सिस्टम पर, सादे char, एक हस्ताक्षरित प्रकार होता है तो byte0xff के एक कार्यान्वयन-परिभाषित रूपांतरण को लागू करने का परिणाम होता है; इस रूपांतरण का सामान्य परिणाम -1 है।

संबंधित मुद्दे