2016-02-03 8 views
5

दो अलग-अलग पूर्णांक प्रकारों वाले अंकगणितीय अभिव्यक्ति के प्रकार को निर्धारित करने के लिए सी ++ द्वारा उपयोग किए जाने वाले नियम क्या हैं?सी ++ पूर्णांक रूपांतरण नियम

आम तौर पर परिणाम को निष्पादित करना आसान है, हालांकि मैं उलझन में हस्ताक्षरित/हस्ताक्षरित इनट्स के मामलों में आया हूं।

उदाहरण के लिए दोनों नीचे वीएस में unsigned int के रूप में बाहर आते हैं।

unsigned int us = 0; 
int s = 1; 

auto result0 = us - s; // unsigned int 
auto result1 = s - us; // unsigned int 

क्या यह अन्य कंपेलरों के लिए समान है? क्या प्रकार निर्धारित करने के लिए कोई विशिष्ट नियम हैं?

+2

क्या आपने [दस्तावेज़ीकरण] (http://en.cppreference.com/w/cpp/language/auto) पढ़ा है? – NathanOliver

+0

नियम 'ऑटो एक्स {expr}; '/' auto x = {expr}; '' को छोड़कर नियम टेम्पलेट प्रकार की कटौती के समान हैं। – Michael

+6

यह लगभग प्रचार पदोन्नति के एक सवाल की तरह लगता है तो ऑटो कटौती। – NathanOliver

उत्तर

5

यह सब अच्छी तरह से परिभाषित है।

1पर हस्ताक्षर शाब्दिक है। वास्तव में, यदि आप इसे unsigned चाहते थे, तो आपको हेक्साडेसिमल या ऑक्टल नोटेशन, उचित प्रत्यय (उदाहरण के लिए u), या एक कास्ट का उपयोग करना होगा।

अंकगणितीय संचालन का सामना करना पड़ा है, तो है कि एक signed int और एक unsigned int तर्क के रूप में, तो signed int है एक unsigned int प्रकार के बदल दिया।

+0

अभिन्न रूपांतरण के सभी विवरण गंतव्य प्रकार पर निर्भर करते हैं, लेकिन जब यह ऑटो है तो यह अज्ञात है? –

+2

"अभिन्न रूपांतरण के सभी विवरण गंतव्य प्रकार पर निर्भर करते हैं"। बिल्कुल ** यह ** कभी नहीं ** मामला है। – Bathsheba

+0

http://en.cppreference.com/w/cpp/language/implicit_cast#Integral_conversions –

0

यहाँ एक छोटी, rought जवाब है, मुझे आशा है कि यह उपयोगी है, भले ही यह सब कुछ कवर नहीं करता है और यहां तक ​​कि एक अति हो सकता है: जब तक 'U' के रूप में निर्दिष्ट

  1. Literals प्रवेश किया है।

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

  3. ध्यान दें कि 'char' का अर्थ हस्ताक्षर किए गए चार का मतलब हो सकता है, जबकि 'int' का अर्थ हमेशा हस्ताक्षरित int है।

+0

3. पूरी कहानी नहीं, चार, हस्ताक्षरित चार और हस्ताक्षरित चार 3 अलग-अलग प्रकार हैं। सी मानक गारंटी देता है कि मूल निष्पादन चरित्र सेट के सभी सदस्यों के पास गैर-ऋणात्मक मान हैं। संपादन का जवाब –

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