जीसीसी इस कोड को चेतावनी देता है:

unsigned char i = 1;
unsigned char j = 2;
i += j;

कहते हैं:

warning: conversion to 'unsigned char' from 'int' may alter its value [-Wconversion]
   i += j;
        ^

ऐसा लगता है कि j को परोक्ष रूप से int में बदल दिया गया है।
समान प्रकार के चर जोड़ने के लिए निहित रूपांतरण क्यों होता है?

3
equal-l2 14 मार्च 2017, 13:58

2 जवाब

सबसे बढ़िया उत्तर

C पूर्णांक प्रचार को अनिवार्य करता है, C11 N1570/6.3.1.1p2< को उद्धृत करते हुए /ए>

जहां कहीं भी एक इंट या अहस्ताक्षरित इंट का उपयोग किया जा सकता है, वहां निम्नलिखित का उपयोग अभिव्यक्ति में किया जा सकता है:

  • एक पूर्णांक प्रकार के साथ एक वस्तु या अभिव्यक्ति (इंट या अहस्ताक्षरित इंट के अलावा) जिसका पूर्णांक रूपांतरण रैंक इंट और अहस्ताक्षरित इंट के रैंक से कम या उसके बराबर है।

यदि एक इंट मूल प्रकार के सभी मानों का प्रतिनिधित्व कर सकता है (जैसा कि चौड़ाई द्वारा प्रतिबंधित है, बिट-फ़ील्ड के लिए), मान को एक इंट में बदल दिया जाता है

तो आपका unsigned char वैरिएबल इस तरह के एक्सप्रेशन में उपयोग किया जाता है और जैसे कि int में कनवर्ट किया जाता है, क्योंकि i += j कार्यात्मक रूप से i = i + j के बराबर है।

यदि आप निश्चित रूप से जानते हैं तो परिणाम unsigned char की सीमा में है, तो असाइन करने से पहले जोड़ के परिणाम पर केवल एक कास्ट लागू करें, जैसे:

i = (unsigned char)(i + j)
4
StoryTeller - Unslander Monica 14 मार्च 2017, 14:10

यहाँ C11 ड्राफ्ट मानक 5.1.2.3 (पृष्ठ 15) में इसी मामले के बारे में (लगभग) क्या कहता है:

उदाहरण 2

टुकड़े को क्रियान्वित करने में

char c1, c2;
/* ... */
c1 = c1 + c2;

"पूर्णांक प्रचार" के लिए आवश्यक है कि सार मशीन प्रत्येक चर के मान को int आकार में बढ़ावा दें और फिर दो जोड़ें ints और योग को छोटा करें। बशर्ते दो chars का योग हो सकता है 5.1.2.3 पर्यावरण 15 आईएसओ/आईईसी 9899:201x समिति ड्राफ्ट के बिना किया गया — अप्रैल 12, 2011 N1570 अतिप्रवाह, या अतिप्रवाह रैपिंग के साथ चुपचाप to सही परिणाम उत्पन्न करते हैं, वास्तविक निष्पादन के लिए केवल उत्पादन की आवश्यकता होती है एक ही परिणाम, संभवतः पदोन्नति को छोड़ना।

इसलिए, यह किया गया है क्योंकि मानक के लिए आवश्यक है कि यह किया जाए। यदि आप जेनरेट किए गए कोड को देखते हैं, तो यह काफी (बहुत) संभव है कि कंपाइलर इतना चालाक हो कि व्यवहार में रूपांतरण बिल्कुल न करे।

5
unwind 14 मार्च 2017, 14:06