2015-04-22 3 views
9

जब मैं जीसीसी के साथ निम्नलिखित कोड संकलन:-Wconversion चेतावनी

conversion to ‘unsigned char’ from ‘int’ may alter its value [-Wconversion]

:

int main() 
{ 
    unsigned char c = 1; 
    c <<= 1; // WARNING ON THIS LINE 
    return 0; 
} 

मैं इस चेतावनी मिल क्यूं कर ? इस कोड के साथ क्या गलत है? असल में, क्या मैं वास्तव में unsigned char चर पर oprator <<= का उपयोग कर सकता हूं?

संकलन आदेश:

g++ test.cpp -Wconversion -o test.exe

+1

यह मुझे लगता है, यह उन लोगों में से एक है, यदि आप कंपाइलर लेखकों और उपयोगकर्ताओं दोनों के लिए परिस्थितियों में "दंडित करते हैं और शापित हैं" में से एक है। एक उपयोगकर्ता के रूप में, जो आपने लिखा है वह साफ है और इच्छित उत्तर उत्पन्न करता है और आमतौर पर पूरी तरह से अपरिहार्य है। और इसे समझने में कठोर बनाने के लिए अतिरिक्त भाषाई अव्यवस्था की आवश्यकता नहीं है। एक कंपाइलर लेखक के रूप में, तकनीकी रूप से एक संकुचित रूपांतरण होता है, इसलिए चेतावनी तकनीकी रूप से सही होती है। लेकिन मैं मदद नहीं कर सकता लेकिन महसूस करता हूं कि इस संदर्भ में, या 'शॉर्ट' (जो संभवतः चेतावनी को ट्रिगर भी करता है) समेत, चेतावनी वास्तव में रचनात्मक नहीं है। –

उत्तर

8

यह एक वैध चेतावनी है:

:

c <<= 1; 

के बराबर है

c = c << 1 

और << के नियमों का कहना है कि ऑपरेटरों को बढ़ावा दिया जाता है और इस मामले में int पर पदोन्नत किया जाएगा और परिणाम प्रचारित प्रकार का है। तो int से unsigned char पर अंत में एक रूपांतरण होगा जिसके परिणामस्वरूप एक परिवर्तित मूल्य हो सकता है।

कोड मान्य है, चेतावनी आपको बता रही है कि एक निहित रूपांतरण हो रहा है और कुछ मामलों में रूपांतरण मूल्य बदल सकता है। एक कास्ट का उपयोग चेतावनी चुप हो जाएगा। निहित रूपांतरणों के परिणाम बहुत प्रतिद्वंद्वी हो सकते हैं और कुछ मामलों में अपरिभाषित व्यवहार। gcc Wconversion wiki for some details देखें।

मैं बाहर मैन्युअल रूप से संचालन के विस्तार और static_cast का उपयोग किए बिना चेतावनी को निकालने के लिए एक रास्ता नहीं दिख रहा है:

c = static_cast<unsigned char>(c << 1); 

हम इस gcc bug report पर लंबे धागे से देख सकते हैं नहीं हर किसी को लगता है कि यह एक है इस चेतावनी के लिए उपयोगी मामला।

draft C++ standard अनुभाग 5.8 शिफ्ट ऑपरेटरों से संदर्भ के लिए:

ऑपरेंड अभिन्न या unscoped गणना प्रकार और अभिन्न प्रोन्नति का होगा प्रदर्शन कर रहे हैं। परिणाम के प्रकार को बढ़ावा दिया बाईं संकार्य का है [...]

और अनुभाग से 5.17 असाइनमेंट और मिश्रित असाइनमेंट ऑपरेटरों:

रूप E1 सेशन की अभिव्यक्ति के व्यवहार = ई 2 ई 1 = ई 1 ओप ई 2 के बराबर है, सिवाय इसके कि ई 1 केवल एक बार मूल्यांकन किया गया है। [...]

+1

मुझे समस्या भी है यदि कोई ऐसा करें << = static_cast (1); '। क्या आप कह रहे हैं कि सी ++ में 1 बाइट प्रकारों के लिए कोई शिफ्ट ऑपरेटर नहीं है? : -/ – Caduchon

+4

देखें [सी और सी ++ में अंकगणितीय परिचालन से पहले एक छोटा सा रूपांतरित क्यों होना चाहिए?] (Http://stackoverflow.com/q/24371868/1708801) एक तर्क के लिए कि क्यों ऑपरेटरों को व्यापक प्रकारों में पदोन्नत किया जाता है । अधिकतर क्योंकि यह तेजी से जेनरेट कोड में परिणाम देता है। –

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