2011-03-15 12 views
6

के बीच लागू रूपांतरण उदाहरण के लिए, unsigned short और int के बीच ऑपरेशन का परिणाम हमेशा int उत्पन्न करता है?डेटाटाइप

unsigned short s = 65535; 
int i = 65535 

अभिव्यक्ति typeid(s * i * i).name(), एक मूल्य है जो एक int की सीमा से बाहर है, लेकिन अभी भी अंतर्निहित रूपांतरण एक int देता है, क्यों देता है?

उत्तर

12

usual arithmetic conversions नामक रूपांतरणों का एक सेट है जिसका उपयोग अधिकांश अंकगणितीय ऑपरेटरों के मूल्यांकन से पहले किया जाता है।

असल में, तुम वहाँ पर विचार कर सकते पूर्णांकों पर गणित के लिए कुछ नियम होने के लिए:

  • पहले, पूर्णांक गणित, ऑपरेंड int "की तुलना में छोटे" के साथ प्रदर्शन कभी नहीं है short * signed char, दोनों के मामले में तो short और signed char ऑपरेटरों को int पर पदोन्नत किया जाता है, दो int मान गुणा किए जाते हैं, और फिर परिणाम int होता है।

  • दूसरा, यदि एक या दोनों प्रकार int से बड़े हैं, तो संकलक एक प्रकार का चयन करता है जो कम से कम "जितना बड़ा" सबसे बड़ा ऑपरेंड के प्रकार के रूप में होता है। इसलिए, यदि आपके पास long * int है, तो int को long पर प्रचारित किया गया है और परिणाम long है।

  • तीसरा, यदि कोई ऑपरेंड unsigned है, तो परिणाम हस्ताक्षरित है। इसलिए, यदि आपके पास long * unsigned int है, तो long और unsigned int दोनों को unsigned long पर प्रचारित किया गया है और परिणाम unsigned long है।

या तो संकार्य बिंदु प्रकार चल गया है, तो चल बिन्दु गणित किया जाता है: float, double, या long double प्रयोग किया जाता है (जो एक ऑपरेंड के प्रकार पर निर्भर करता है, परिणाम प्रकार का निर्धारण किया जाता पूर्ण तालिका इस उत्तर की शुरुआत में जुड़े पेज पर पाया जा सकता है)।

ध्यान दें कि परिणाम प्रकार ऑपरेटरों के मूल्य पर निर्भर नहीं है। मानों को ज्ञात होने से पहले संकलन समय पर कंपाइलर द्वारा प्रकार का चयन किया जाना चाहिए।

यदि s * i * i का परिणाम परिणाम प्रकार (int, आपके परिदृश्य में) से बाहर है, तो आप भाग्य से बाहर हैं: आपका प्रोग्राम रनटाइम पर निर्णय नहीं ले सकता है, "ओह, मुझे उपयोग पर स्विच करना चाहिए एक long! " क्योंकि परिणाम प्रकार को संकलन समय पर चुना जाना था।

+0

धन्यवाद, अच्छा जवाब। – user3234

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