2010-07-30 17 views
8
#include <stdio.h> 
int main() 
{ 
    unsigned char i=0x80; 
    printf("%d",i<<1); 
    return 0; 
} 

यह प्रोग्राम 256 क्यों प्रिंट करता है?हस्ताक्षरित चार का अधिकतम मूल्य

मुझे यह समझ के रूप में, 0x80 = 0b10000000, और अहस्ताक्षरित चार के बाद से, '1' के बाद पारी को छोड़ दिया अतिप्रवाह चाहिए 8 बिट किया है और उत्पादन 0 होना चाहिए, नहीं 256.

+2

उत्तर के रूप में पोस्ट नहीं करना चाहते क्योंकि मैं 100% निश्चित नहीं हूं, लेकिन ऐसा नहीं है क्योंकि% d एक पूर्णांक है? तो, दृश्यों के पीछे कोड शायद इसे प्रिंट करने के लिए एक पूर्णांक में 'i << 1' असाइन करता है, जिसका अर्थ है कि यह फिट बैठता है और बहता नहीं है। 'Printf ("% c ", i << 1) करने का प्रयास करें;'? – Stephen

+0

@ स्टीफन: जवाब पोस्ट करना चाहिए था;) – KevenK

+0

@ स्टीफन: जब मैं% c का उपयोग करता हूं तो आउटपुट खाली होता है। – Variance

उत्तर

14

यह सी का एक परिणाम है पूर्णांक पदोन्नति नियम। अनिवार्य रूप से, अभिव्यक्ति में जाने वाले किसी भी चर को "प्रचारित" किया जाता है ताकि इस तरह के संचालन परिशुद्धता को न खोएं। फिर, यह int के रूप में printf में पारित किया गया है, सी के परिवर्तनीय तर्क नियमों के अनुसार। स्टीफन टिप्पणी के रूप में विनिर्दिष्ट काम नहीं करेगा क्योंकि %c एक उम्मीद %c का उपयोग कर:

आप चाहते हैं कि आप क्या देख रहे हैं, तो आप unsigned char वापस करने के लिए कास्ट करने के लिए होगा:

#include <stdio.h> 
int main() 
{ 
    unsigned char i=0x80; 
    printf("%d",((unsigned char)(i<<1))); 
    return 0; 
} 

नोट पूर्णांक भी

संपादित करें: इसके अलावा, आप ऐसा कर सकता है:

#include <stdio.h> 
int main() 
{ 
    unsigned char i=0x80; 
    unsigned char res = i<<1; 
    printf("%d",res); 
    return 0; 
} 

या

#include <stdio.h> 
int main() 
{ 
    unsigned char i=0x80; 
    printf("%d",(i<<1) & 0xFF); 
    return 0; 
} 
+0

क्या आप '(i << 1) 'को' हस्ताक्षरित चार 'पर डाल सकते हैं? – nmichaels

+0

@ नाथन: क्या मैंने ऐसा नहीं किया है? –

+1

अजीब, मेरे अंधेरे चालू होना चाहिए। – nmichaels

0

अहस्ताक्षरित मुद्रण के लिए विशेष रूप प्रारूप मत भूलना।

printf("%u",(unsigned char)(i<<1)); 
+0

सी के पदोन्नति नियमों के कारण, तर्क संभवतया' printf' को 'हस्ताक्षरित int' के रूप में पारित किया जाएगा, न कि हस्ताक्षरित ' 'आपको तर्क को उस प्रकार पर डालना चाहिए जो प्रारूप विनिर्देशक से मेल खाता हो। –

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