2012-06-26 22 views
7

प्रश्न Bitshift and integer promotion? के समान प्रश्न, मेरे पास बाएं बिट्सफिफ्ट का उपयोग करते समय पूर्णांक पदोन्नति के बारे में एक प्रश्न है।ऑपरेटर के साथ पूर्णांक पदोन्नति <<

unsigned int test(void) 
{ 
    unsigned char value8; 
    unsigned int result; 

    value8 = 0x12; 
    result = value8 << 8; 
    return result; 
} 

इस मामले में, हो जाएगा value8 पहले unsiged पूर्णांक को बढ़ावा देने या इसे विशिष्ट कार्यान्वयन है?

6.5.7 बिटवाइस पारी ऑपरेटरों ... 3 sematics ...
पूर्णांक प्रोन्नति ऑपरेंड में से प्रत्येक पर प्रदर्शन कर रहे हैं। परिणाम का प्रकार प्रमोटेड बाएं ऑपरेंड की है। यदि दाएं ऑपरेंड का मान ऋणात्मक है या प्रचारित बाएं ऑपरेंड की चौड़ाई से अधिक या बराबर है, तो व्यवहार अपरिभाषित है।

इसमें कहा गया है कि "पूर्णांक प्रोन्नति ऑपरेंड में से प्रत्येक पर प्रदर्शन कर रहे हैं।", लेकिन पदोन्नति नियम यहां क्या है?

मुझे लगता है कि यह convert to int if lesser rank than int होना चाहिए, लेकिन मुझे यह नहीं मिल रहा है।

मैं यह पूछता हूं, क्योंकि एक कंपाइलर (रेनेसास एनसी 30वा) int को बढ़ावा नहीं देता है, इसलिए परिणाम हमेशा मेरे नमूने के लिए 0 होता है।

इस प्लेटफ़ॉर्म पर, एक char 8 बिट चौड़ा और int 16 बिट्स है।

+2

यदि मान 8 को प्रचारित नहीं किया गया है, तो यह एक कंपाइलर बग है। –

+1

वास्तव में यह सवाल है, क्या यह एक बग या कार्यान्वयन विशिष्ट है? – jeb

+0

@jeb मेरे उत्तर में संपादन देखें, कुछ संकलक डिफ़ॉल्ट रूप से पूर्णांक प्रचार अक्षम करते हैं और इसे संकलक दस्तावेज़ में दस्तावेज करते हैं। आपको कंपाइलर दस्तावेज में आईएसओ अनुरूपता की तलाश करनी है। – ouah

उत्तर

12

वाक्यांश "पूर्णांक प्रचार" एक बहुत ही विशेष बात यह है कि, (C99 के लिए) में पाया अनुभाग 6.3.1.1 Booleans, characters, and integers है:

किसी पूर्णांक मूल प्रकार के सभी मूल्यों का प्रतिनिधित्व कर सकते हैं, मूल्य एक में बदल जाती है पूर्णांक; अन्यथा, इसे एक हस्ताक्षरित int में परिवर्तित कर दिया जाता है। इन्हें पूर्णांक प्रचार कहा जाता है। अन्य सभी प्रकार पूर्णांक प्रचार द्वारा अपरिवर्तित हैं।

तो यह सोचते हैं अपने unsigned char एक int में आयोजित किया जा सकता है, यह एक int करने के लिए प्रोत्साहित किया जाएगा। उन दुर्लभ प्लेटफार्मों पर जहां unsigned charint के रूप में चौड़ा है, यह unsigned int को बढ़ावा देगा। मूल्य एक में बदल जाती है एक पूर्णांक मूल प्रकार के सभी मूल्यों (के रूप में एक बिट क्षेत्र के लिए, चौड़ाई द्वारा प्रतिबंधित) का प्रतिनिधित्व कर सकते

हैं, तो:

यह केवल C11 में थोड़ा बदल गया है पूर्णांक; अन्यथा, इसे एक हस्ताक्षरित int में परिवर्तित कर दिया जाता है।इन्हें पूर्णांक प्रचार कहा जाता है। अन्य सभी प्रकार पूर्णांक प्रचार द्वारा अपरिवर्तित हैं।

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

कई विशिष्ट उद्देश्यों के लिए बनाए गए हैं और अनुरूपता आवश्यकताओं की सूची पर हमेशा उच्च नहीं है। कंपाइलर झंडे हो सकते हैं जो इसे मानक के अनुरूप बारीकी से करने की अनुमति देंगे।


अनुभाग 2.1.4 nc30 Command Line Options, उपधारा f. Generated code modification options में अपने विशेष वातावरण को देखते हुए, M16C Series,R8C Family C Compiler Package V.5.45 C Compiler (here देखें),:

-fextend_to_int (-fETI):
          Int प्रकार के लिए चार प्रकार के डेटा को विस्तारित करने के बाद ऑपरेशन करता है। एएनएसआई मानकों के अनुसार विस्तारित।

हालांकि मुझे संदेह है कि -fansi शायद बेहतर विकल्प है क्योंकि इसमें कुछ अन्य चीजें शामिल हैं।

3

value8int करने के लिए प्रोत्साहित किया जाता है, यह मानते हुए unsigned char के रूपांतरण रैंक int के रूपांतरण रैंक (आमतौर पर सबसे प्लेटफार्मों पर मामला) से कम है।

पूर्णांक के रूपांतरण रैंक को C.1 में 6.3.1.1 में वर्णित किया गया है।

ध्यान दें कि कुछ कंपाइलर डिफ़ॉल्ट रूप से पूर्णांक प्रचार नियम अक्षम करते हैं। उदाहरण के लिए, माइक्रोचिप कंपाइलर एमपीएलबी सी 18। अपने कंपाइलर के दस्तावेज़ीकरण में आईएसओ अनुरूपता की तलाश करें।

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