2012-03-04 13 views
6

निम्न कोड में:डेटाप्रकार पदोन्नति

#include "stdio.h" 
signed char a= 0x80; 
unsigned char b= 0x01; 


void main (void) 
{ 
    if(b*a>1) 
     printf("promoted\n"); 
    else if (b*a<1) 
     printf("why doesnt promotion work?"); 

    while(1); 
} 

मैं "पदोन्नत 'अपेक्षित मुद्रित करने के लिए लेकिन यह does not क्यों अगर मैं कर सकते हैं पर हस्ताक्षर किए और अहस्ताक्षरित पूर्णांक के लिए डेटाटाइप्स, और एक के रूप में की है।।? एक ऋणात्मक संख्या, जैसे, 0x80000000 और ख एक सकारात्मक संख्या, 0x01 के रूप में, "पदोन्नत" उम्मीद के रूप में मुद्रित किया जाता है।

plz मेरी मदद को समझने कि समस्या क्या है!

उत्तर

10

तुम बस गन्दा द्वारा पकड़ा गया है सी

के प्रकार-पदोन्नति नियम

सी में, int से छोटे अभिन्न प्रकार के मध्यवर्ती स्वचालित रूप से int पर प्रचारित होते हैं।

तो तुम हो:

0x80 * 0x01 = -128 * 1 

0x80 टाइप करने के लिए int बढ़ाया हस्ताक्षर किया जाता है:

0xffffff80 * 0x00000001 = -128 * 1 = -128 

तो परिणाम -128 है और इस तरह 1 से कम है।


आप प्रकार int और unsigned int उपयोग करते हैं, दोनों ऑपरेंड unsigned int के लिए प्रोत्साहित किया जाता है। 0x80000000 * 0x01 = 0x80000000 एक हस्ताक्षरित पूर्णांक के रूप में 1 से बड़ा है।


तो यहाँ प्रकार पदोन्नति की तुलना साइड-बाई-साइड कि जगह ले जा रहा है:

(signed char) * (unsigned char) -> int 
(signed int) * (unsigned int) -> unsigned int 

(signed char)0x80  * (unsigned char)0x01 -> (int)   0xffffff80 
(signed int)0x80000000 * (unsigned int)0x01 -> (unsigned int)0x80000000 

(int)   0xffffff80 is negative -> prints "why doesnt promotion work?" 
(unsigned int)0x80000000 is positive -> prints "promoted" 

Here's a reference to the type-promotion rules of C.

+0

@ मानसिक मैं आपके उत्तर को समझ नहीं पा रहा हूं। यहां तक ​​कि यदि यह int टाइप करने के लिए विस्तारित हो जाता है, जो मुझे नहीं लगता है, लेकिन यह मानते हुए, यह क्यों हस्ताक्षरित int को प्रचारित नहीं किया जा रहा है, और उत्पाद एक संख्या है? – Dom045

+0

+1 - यह उत्तर एक लंबी मील (इसलिए मैंने इसे हटा दिया) से अधिक बेहतर/अधिक प्रासंगिक है –

+0

@ Dom045 क्योंकि विनिर्देश ऐसा कहता है। 'हस्ताक्षर किए गए चार 'और' हस्ताक्षरित चार 'दोनों' int 'से कम प्रकार के होते हैं। तो उन्हें दोनों को 'int' में पदोन्नत किया जाएगा। 'हस्ताक्षरित int' बनाम 'हस्ताक्षरित int' मामले में, मानक निर्देश देता है कि वे दोनों को 'हस्ताक्षरित int' में परिवर्तित किया जाए। नियम यहां पाए जा सकते हैं: https://www.securecoding.cert.org/confluence/display/seccode/INT02-C.+Understand+integer+conversion+rules – Mysticial

2

कारण printf("promoted\n"); कभी नहीं चलाता है b*a हमेशा होता है क्योंकि == -128 , जो 1

a  b  
0x80 * 0x01 = -128 * 1 
से कम है
संबंधित मुद्दे