मूल्यांकन करते समय क्या होता है

int x = -2147483648

?

  1. -2147483648 का मूल्यांकन करते समय, 2147483648 एक पूर्णांक स्थिरांक है जिसमें लंबा प्रकार int नहीं है, इसलिए -2147483648 का मूल्यांकन करने का परिणाम -2147483648 प्रकार लंबा है, int नहीं।

  2. असाइनमेंट "int x = ..." का मूल्यांकन करते समय, RHS लंबे प्रकार का मान -2147483648 है, जो x के प्रकार int की सीमा में है। क्या मान -2147483648 को लंबे समय से int में परिवर्तित किया जाएगा, और रूपांतरण मान -2147483648 अपरिवर्तित रहेगा?

धन्यवाद।

-4
Tim 15 अक्टूबर 2020, 20:20

2 जवाब

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

यह उत्तर मानता है कि सी कार्यान्वयन 32-बिट int और 64-बिट long का उपयोग करता है।

सी २०१८ ६.४.४.१ कहता है "एक पूर्णांक स्थिरांक का प्रकार संगत सूची में पहला है जिसमें इसके मान का प्रतिनिधित्व किया जा सकता है।" निम्नलिखित तालिका में, बिना प्रत्यय वाले दशमलव स्थिरांक की प्रविष्टि में सूची int, long int, long long int है। चूँकि एक long int उनमें से पहला है जो 2,147,483,648 का प्रतिनिधित्व कर सकता है, 2147483648 का प्रकार long int है।

प्रति 6.5.3.3 3, - का परिणाम प्रचारित प्रकार है। पूर्णांक प्रचार (6.3.1.1 2) का long int पर कोई प्रभाव नहीं पड़ता है। तो -2147483648 का प्रकार long int है।

प्रति 6.7.9 11, प्रारंभकर्ता का मान साधारण असाइनमेंट के रूप में परिवर्तित किया जाता है। प्रति ६.५.१६.१ २ और ६.५.१६ ३, मान को उस प्रकार के ऑब्जेक्ट में परिवर्तित किया जाता है जिसे असाइन किया जा रहा है जो कि लैवल्यू रूपांतरण के बाद होगा। यानी, किसी int ऑब्जेक्ट को असाइनमेंट के लिए, प्रकार एक int मान है।

प्रति 6.3.1.3 1, जब पूर्णांक प्रकार के मान को किसी अन्य पूर्णांक प्रकार में परिवर्तित किया जाता है, यदि नया प्रकार मान का प्रतिनिधित्व कर सकता है, तो यह अपरिवर्तित रहता है। चूंकि int −2,147,483,648 का प्रतिनिधित्व कर सकता है, यह अपरिवर्तित है।

इसलिए, int x = -2147483648; का परिणाम यह है कि x को −2,147,483,648 मान के साथ प्रारंभ किया जाता है।

1
Eric Postpischil 15 अक्टूबर 2020, 20:58

इस प्रश्न में आपका विश्लेषण सही है। क्योंकि मान int की सीमा में है और आरंभीकरण के हिस्से के रूप में int में परिवर्तित हो गया है (नोट: असाइनमेंट के लिए भी ऐसा ही होगा), सब कुछ इरादा के अनुसार काम करता है।

जहां तक ​​आपके प्रश्न के छिपे हुए हिस्से का सवाल है, जो आपने नहीं पूछा, क्योंकि यह डुप्लिकेट के रूप में बंद होता रहता है, इसका मतलब यह नहीं है कि आप INT_MIN को -2147483648 के रूप में परिभाषित कर सकते हैं। जादू = में है (असाइनमेंट ऑपरेटर या प्रारंभिक निर्माण में टोकन के रूप में)। ऐसे संदर्भों में जहां इसका उपयोग नहीं किया जा रहा है, ऐसे सभी तरीके हैं जिनसे -2147483648 int के बजाय long या long long टाइप करते हैं, INT_MIN पर अर्थ संबंधी आवश्यकताओं को तोड़ते हैं। उदाहरण के लिए:

  • (INT_MIN < 0U) == 0 (क्योंकि दोनों ऑपरेंड को unsigned में पदोन्नत किया गया है), लेकिन
  • (-2147483648 < 0U) == 1 (क्योंकि दोनों ऑपरेंड को long या long long में पदोन्नत किया जाता है)।
2
R.. GitHub STOP HELPING ICE 15 अक्टूबर 2020, 20:52