मूल्यांकन करते समय क्या होता है
int x = -2147483648
?
-2147483648
का मूल्यांकन करते समय,2147483648
एक पूर्णांक स्थिरांक है जिसमें लंबा प्रकार int नहीं है, इसलिए-2147483648
का मूल्यांकन करने का परिणाम -2147483648 प्रकार लंबा है, int नहीं।असाइनमेंट "int x = ..." का मूल्यांकन करते समय, RHS लंबे प्रकार का मान -2147483648 है, जो
x
के प्रकारint
की सीमा में है। क्या मान -2147483648 को लंबे समय से int में परिवर्तित किया जाएगा, और रूपांतरण मान -2147483648 अपरिवर्तित रहेगा?
धन्यवाद।
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 मान के साथ प्रारंभ किया जाता है।
इस प्रश्न में आपका विश्लेषण सही है। क्योंकि मान int
की सीमा में है और आरंभीकरण के हिस्से के रूप में int
में परिवर्तित हो गया है (नोट: असाइनमेंट के लिए भी ऐसा ही होगा), सब कुछ इरादा के अनुसार काम करता है।
जहां तक आपके प्रश्न के छिपे हुए हिस्से का सवाल है, जो आपने नहीं पूछा, क्योंकि यह डुप्लिकेट के रूप में बंद होता रहता है, इसका मतलब यह नहीं है कि आप INT_MIN
को -2147483648
के रूप में परिभाषित कर सकते हैं। जादू =
में है (असाइनमेंट ऑपरेटर या प्रारंभिक निर्माण में टोकन के रूप में)। ऐसे संदर्भों में जहां इसका उपयोग नहीं किया जा रहा है, ऐसे सभी तरीके हैं जिनसे -2147483648
int
के बजाय long
या long long
टाइप करते हैं, INT_MIN
पर अर्थ संबंधी आवश्यकताओं को तोड़ते हैं। उदाहरण के लिए:
(INT_MIN < 0U) == 0
(क्योंकि दोनों ऑपरेंड कोunsigned
में पदोन्नत किया गया है), लेकिन(-2147483648 < 0U) == 1
(क्योंकि दोनों ऑपरेंड कोlong
याlong long
में पदोन्नत किया जाता है)।