2012-03-15 8 views
5

मैं इस बारे में उलझन में हूं कि printf के मामले में सामान्य रूप से प्रचार कैसे होता है। मैं निम्नलिखित कोड की कोशिश कीprintf प्रकार पदोन्नति और साइन एक्सटेंशन

unsigned char uc = 255 
signed char sc = -128 

printf("unsigned char value = %d \n", uc); 
printf("signed char value = %d \n", sc); 

यह निम्न उत्पादन देता है:

unsigned char value = 255 
signed char value = -128 

यह मैं छोड़ दिया है कैसे पदोन्नति वास्तव में जगह लेता है के बारे में और क्या निशानी विस्तार होता है या नहीं सोच रहा। यदि कोई साइन एक्सटेंशन किया जाता है तो मूल्य 255 को नकारात्मक मान के रूप में मुद्रित किया जाना चाहिए (-128 वही शेष) और यदि कोई साइन एक्सटेंशन नहीं किया जाता है तो -128 को सकारात्मक मान के रूप में मुद्रित किया जाना चाहिए था (255 वही शेष)। कृपया समझाएँ।

उत्तर

4

तो एक संकेत विस्तार तो किया जाता है मूल्य 255 नकारात्मक मूल्य के रूप में मुद्रित किया जाना चाहिए

इस जहाँ तुम गलत हो - 255 सहित प्रकार unsigned char के सभी मूल्यों, एक int में दर्शाया जा सकता है , इसलिए को unsigned char से प्रचार किसी भी मजेदार व्यवसाय के बिना होता है।

जहां समस्याएं तब होती हैं जब हस्ताक्षरित मान परिवर्तित हो सकता है (जो पदोन्नति से अलग बात है, और ऑपरेंड के लिए एक सामान्य प्रकार बनाने के लिए होता है) एक हस्ताक्षरित मूल्य पर। यदि उस हस्ताक्षरित प्रकार का ऋणात्मक मान है, तो एक हस्ताक्षरित प्रकार में रूपांतरण मूल्य बदल जाएगा।

संक्षेप में, पूर्णांक पदोन्नति मूल्य (साइन सहित) को सुरक्षित रखती है, रूपांतरण मूल्य बदल सकता है।

2

साइन एक्सटेंशन किया गया है। लेकिन आप unsigned char का विस्तार करने पर हस्ताक्षर नहीं कर सकते क्योंकि इसमें कोई साइन बिट नहीं है। साइन एक्सटेंशन का पूरा बिंदु मूल्य को समान रखना है। या, यदि आप इस तरह से इस बारे में सोचना पसंद करते हैं, तो प्रत्येक हस्ताक्षरित चर के पास शून्य संकेत बिट अंतर्निहित होता है। इसलिए जब यह एक बड़े हस्ताक्षरित प्रकार के लिए साइन-विस्तारित होता है, तो साइन बिट बड़े प्रकार में शून्य होना चाहिए।

0

साइन एक्सटेंशन किया गया है।

लेकिन uc के मामले के बाद से, कोई संकेत नहीं है, क्योंकि यह unsigned char है, इसलिए यह सकारात्मक छोड़ दिया गया है।

1

दोनों को इनट्स में पदोन्नत किया जाता है - इसलिए साइन रखना।

4

एक va_arg फ़ंक्शन ... भाग के अपेक्षित प्रकार पर कोई जानकारी नहीं है। इसलिए प्रोटोटाइप के बिना घोषित कार्यों के लिए पदोन्नति नियम लागू होते हैं। इसका मतलब है कि int से कम सभी प्रकार int या unsigned पर सीधे प्रचारित किए जाते हैं। तो आपका printf फ़ंक्शन कभी भी (un)signed char नहीं देखता है।