C ++ ऑपरेटरों में निहित प्रकार रूपांतरण नियम


167

मैं यह जानना चाहता हूं कि मुझे कब कास्ट करना चाहिए। जोड़ते समय C ++ में निहित प्रकार के रूपांतरण नियम क्या हैं, उदाहरण के लिए, आदि।

int + float = ?
int * float = ?
float * int = ?
int / float = ?
float / int = ?
int / int = ?
int ^ float = ?

वगैरह-वगैरह ...

क्या अभिव्यक्ति का मूल्यांकन हमेशा अधिक सटीक प्रकार के रूप में किया जाएगा? क्या जावा के लिए नियम अलग हैं? कृपया मुझे सही करें अगर मैंने इस प्रश्न को गलत तरीके से कहा है।


16
ध्यान रखें ^XOR।
GManNickG

16
@int ^ फ्लोट = संकलन त्रुटि :)
सर्ज डंडीच

जवाबों:


223

C ++ ऑपरेटरों में (POD प्रकारों के लिए) हमेशा एक ही प्रकार की वस्तुओं पर कार्य करते हैं।
इस प्रकार यदि वे समान नहीं हैं, तो उन्हें दूसरे से मेल खाने के लिए बढ़ावा दिया जाएगा।
ऑपरेशन के परिणाम का प्रकार ऑपरेंड (रूपांतरण के बाद) के समान है।

If either is      long          double the other is promoted to      long          double
If either is                    double the other is promoted to                    double
If either is                    float  the other is promoted to                    float
If either is long long unsigned int    the other is promoted to long long unsigned int
If either is long long          int    the other is promoted to long long          int
If either is long      unsigned int    the other is promoted to long      unsigned int
If either is long               int    the other is promoted to long               int
If either is           unsigned int    the other is promoted to           unsigned int
If either is                    int    the other is promoted to                    int
Both operands are promoted to int

ध्यान दें। संचालन का न्यूनतम आकार है int। इसलिए short/ ऑपरेशन किए charजाने intसे पहले प्रचार किया जाता है।

आपके सभी अभिव्यक्तियों में ऑपरेशन intकरने floatसे पहले प्रचार किया जाता है। ऑपरेशन का परिणाम ए है float

int + float =>  float + float = float
int * float =>  float * float = float
float * int =>  float * float = float
int / float =>  float / float = float
float / int =>  float / float = float
int / int                     = int
int ^ float =>  <compiler error>

1
"परिचालन का न्यूनतम आकार अंतर है।" - यह बहुत अजीब होगा (आर्किटेक्चर के बारे में जो कुशलतापूर्वक चार / लघु संचालन का समर्थन करते हैं?) क्या यह वास्तव में सी ++ की कल्पना है?
राफेल डाउगर्ड

3
@ रफाल: हाँ। int को किसी विशेष प्लेटफॉर्म पर ऑपरेशन के लिए सबसे कुशल पूर्णांक प्रकार माना जाता है। char हमेशा 1 होना चाहिए लेकिन शॉर्ट इंट के समान आकार हो सकता है।
मार्टिन यॉर्क

1
@ राफेल: हाँ, यह बहुत अजीब है और यह मानक में है। बहुत सारे मामलों में, जिस वास्तुकला का आप वर्णन करते हैं, वह इसके सुपर-कुशल charप्रकार का उपयोग कर सकती है । यदि का मान char + chara को असाइन किया गया है char, तो यह केवल अंकगणित में charऔर उदाहरण के लिए चारों ओर रैप कर सकता है। लेकिन अगर रिजल्ट सौंपा गया है, intतो उसे एक प्रकार से अंकगणित करना होगा, जब वह इससे अधिक हो तो सही परिणाम प्राप्त कर सके CHAR_MAX
स्टीव जेसप

2
मैं सिर्फ इस तथ्य पर जोर देना चाहता हूं कि int को अहस्ताक्षरित int को बढ़ावा दिया जाता है !!! मैंने कई दिनों तक बग के साथ संघर्ष किया है क्योंकि मैं इस धारणा के तहत था कि दोनों को इंट या लंबे समय तक पदोन्नत किया जाएगा ताकि एक संभावित नकारात्मक परिणाम एक अंडरफ्लो / रैप-अराउंड का कारण न बने।
नितास

10
समस्या का उदाहरण " int को अहस्ताक्षरित int में पदोन्नत किया जाता है ": 32 बिट ints और 32 बिट अहस्ताक्षरित ints के लिए ((int) 4) - ((unsigned int) 5)परिणाम होगा 4294967295
नितास

33

अंकगणितीय परिचालनों में floatपरिणाम शामिल हैं float

int + float = float
int * float = float
float * int = float
int / float = float
float / int = float
int / int = int

अधिक विस्तार से जवाब के लिए। सी ++ मानक से अनुभाग §5 / 9 को देखें

कई बाइनरी ऑपरेटर्स जो अंकगणित या एन्यूमरेशन प्रकार के ऑपरेंड की उम्मीद करते हैं, एक समान तरीके से रूपांतरण और उपज परिणाम प्रकार का कारण बनते हैं। उद्देश्य एक सामान्य प्रकार की उपज है, जो परिणाम का प्रकार भी है

इस पैटर्न को सामान्य अंकगणितीय रूपांतरण कहा जाता है, जिसे निम्नानुसार परिभाषित किया गया है:

- यदि या तो ऑपरेंड टाइप डबल का है, तो दूसरा लॉन्ग डबल में बदल जाएगा।

- अन्यथा, यदि या तो ऑपरेंड डबल है, तो दूसरे को डबल में बदल दिया जाएगा।

- अन्यथा, यदि या तो ऑपरेंड फ्लोट है, तो दूसरे को फ्लोट में बदल दिया जाएगा।

- अन्यथा, अभिन्न पदोन्नति (4.5) दोनों ऑपरेंड पर किया जाएगा ।.54)

- फिर, यदि किसी भी ऑपरेंड को लंबे समय तक अनसाइन किया जाता है तो दूसरे को लंबे समय के लिए बदल दिया जाएगा।

- अन्यथा, यदि एक ऑपरेंड एक लंबा इंट और दूसरा अहस्ताक्षरित इंट है, तो यदि एक लंबा इंट एक अहस्ताक्षरित इंट के सभी मूल्यों का प्रतिनिधित्व कर सकता है, तो अहस्ताक्षरित इंट एक लंबे इंट में परिवर्तित हो जाएगा; अन्यथा दोनों ऑपरेंड को लंबे समय तक अप्रयुक्त में परिवर्तित किया जाएगा।

- अन्यथा, यदि या तो ऑपरेंड लंबा है, तो दूसरे को लंबे समय तक परिवर्तित किया जाएगा।

- अन्यथा, यदि कोई ऑपरेंड अहस्ताक्षरित है, तो दूसरे को अहस्ताक्षरित में बदल दिया जाएगा।

[नोट: अन्यथा, केवल शेष मामला यह है कि दोनों ऑपरेंड int हैं]


3
... तो जब तक दूसरा प्रकार न तो है doubleऔर न ही है long double
सीबी बेली

1
@Charles: सही है। मैंने मानक से संबंधित अनुभाग को और स्पष्ट करने के लिए उद्धृत किया।
नवाज

तो क्या किसी पूर्णांक को बिना किसी डेटा हानि के हमेशा फ्लोट में परिवर्तित किया जा सकता है? (जैसे शून्य-आईएनजी प्रतिपादक और मंटिसा के लिए सब कुछ का उपयोग करके)?
मार्को ए।

1
यह उत्तर पुराना है। अद्यतन का सुझाव दें। विशेष रूप से, long longऔर unsigned longयहीं संबोधित नहीं किया।
chux -

@MarcoA। 32-बिट के floatलिए मंटिसा में पर्याप्त बिट्स ( IEEE-754 के लिए 24 बिट्स ) में पर्याप्त बिट्स नहीं है int, इसलिए कुछ डेटा हानि हो सकती है। 64-बिट doubleठीक होना चाहिए।
रैनसम

17

चूँकि अन्य उत्तर C ++ 11 के नियमों के बारे में यहाँ बात नहीं करते हैं। C ++ 11 मानक (n3337 ड्राफ्ट) से 95/9 (अंतर पर जोर दिया):

इस पैटर्न को सामान्य अंकगणितीय रूपांतरण कहा जाता है , जिसे निम्नानुसार परिभाषित किया गया है:

- यदि या तो ऑपरेंड स्कूप्ड एन्यूमरेशन प्रकार का है, तो कोई रूपांतरण नहीं किया जाता है; यदि अन्य ऑपरेंड में समान प्रकार नहीं है, तो अभिव्यक्ति बीमार है।

- यदि या तो ऑपरेंड टाइप डबल का है, तो दूसरा लॉन्ग डबल में बदल जाएगा।

- अन्यथा, यदि या तो ऑपरेंड डबल है, तो दूसरे को डबल में बदल दिया जाएगा।

- अन्यथा, यदि या तो ऑपरेंड फ्लोट है, तो दूसरे को फ्लोट में बदल दिया जाएगा।

अन्यथा, अभिन्न पदोन्नति दोनों ऑपरेंड पर किया जाएगा। फिर निम्नलिखित नियम प्रमोटेड ऑपरेंड्स पर लागू होंगे:

- यदि दोनों ऑपरेंड्स एक ही प्रकार के हैं, तो आगे रूपांतरण की आवश्यकता नहीं है।

- अन्यथा, यदि दोनों ऑपरेंडों ने पूर्णांक प्रकारों पर हस्ताक्षर किए हैं या दोनों के पास पूर्णांक प्रकार हैं, तो कम पूर्णांक रूपांतरण प्रकार के साथ ऑपरेंड को अधिक रैंक वाले ऑपरेटर के प्रकार में परिवर्तित किया जाएगा।

- अन्यथा, यदि संकार्य वाले पूर्णांक प्रकार के ऑपरेटर के पास दूसरे ऑपरेटर के प्रकार के रैंक से अधिक या उसके बराबर रैंक है, तो हस्ताक्षर किए गए पूर्णांक प्रकार वाले ऑपरेटर को बिना पूर्णांक प्रकार वाले ऑपरेटर के प्रकार में परिवर्तित किया जाएगा।

- अन्यथा, यदि हस्ताक्षरित पूर्णांक प्रकार के साथ ऑपरेंड का प्रकार सभी के मानों को निरूपित पूर्णांक प्रकार के साथ ऑपरेट कर सकता है, तो अहस्ताक्षरित पूर्णांक प्रकार वाला ऑपरेटर हस्ताक्षर किए गए पूर्णांक प्रकार के साथ ऑपरेटर के प्रकार में परिवर्तित हो जाएगा।

- अन्यथा, दोनों ऑपरेंड को हस्ताक्षरित पूर्णांक प्रकार के साथ ऑपरेटर के प्रकार के अनुरूप अहस्ताक्षरित पूर्णांक प्रकार में परिवर्तित किया जाएगा।

अक्सर अद्यतन की जाने वाली सूची के लिए यहां देखें ।


1
ये नियम C ++ के सभी संस्करणों में समान थे, सिवाय scumed enumerations को छोड़कर जो C ++ 11 के पाठ्यक्रम में जोड़े गए थे
MM

6

यह उत्तर बड़े स्तर पर @ RafałDowgird द्वारा की गई टिप्पणी पर निर्देशित है:

"परिचालन का न्यूनतम आकार अंतर है।" - यह बहुत अजीब होगा (आर्किटेक्चर के बारे में जो कुशलतापूर्वक चार / लघु संचालन का समर्थन करते हैं?) क्या यह वास्तव में सी ++ की कल्पना है?

ध्यान रखें कि C ++ मानक में सभी महत्वपूर्ण "as-if" नियम है। खंड 1.8 देखें: कार्यक्रम निष्पादन:

3) इस प्रावधान को कभी-कभी "जैसा-अगर" नियम कहा जाता है, क्योंकि एक कार्यान्वयन मानक की किसी भी आवश्यकता की अवहेलना करने के लिए स्वतंत्र है क्योंकि परिणाम तब तक होता है जैसे कि आवश्यकता का पालन किया गया था, जहां तक ​​कि अवलोकन से निर्धारित किया जा सकता है कार्यक्रम का व्यवहार।

कंपाइलर intआकार में 8 बिट्स सेट नहीं कर सकता है, भले ही यह सबसे तेज़ हो, क्योंकि मानक 16-बिट न्यूनतम है int

इसलिए, सुपर-फास्ट 8-बिट संचालन के साथ एक सैद्धांतिक कंप्यूटर के मामले में, intअंकगणित के लिए निहित पदोन्नति मायने रख सकती है। हालाँकि, कई परिचालनों के लिए, आप यह नहीं बता सकते हैं कि कंपाइलर ने वास्तव में a की परिशुद्धता में परिचालनों को किया intऔर फिर charअपने वैरिएबल में स्टोर करने के लिए रूपांतरित किया , या यदि प्रचालन चारो ओर किया गया था।

उदाहरण के लिए, विचार करें unsigned char = unsigned char + unsigned char + unsigned char, जहां अतिरिक्त अतिप्रवाह होगा (चलो प्रत्येक के लिए 200 का मान लें)। यदि आप पदोन्नत होते हैं int, तो आपको 600 मिलेंगे, जो बाद में एक में डाले unsigned charजाएंगे, जो मोडुलो 256 में लपेटेगा, इस प्रकार 88 का अंतिम परिणाम देगा। यदि आपने ऐसा कोई पदोन्नति नहीं की है, तो आपको पहले के बीच में लपेटना होगा। दो अतिरिक्त, जिसमें से समस्या कम होगी 200 + 200 + 200करने के लिए 144 + 200जो 88 को कम कर देता दूसरे शब्दों में, जो है 344,, कार्यक्रम अंतर पता नहीं है, इसलिए संकलक में मध्यवर्ती कार्रवाई करने जनादेश की अनदेखी करने के लिए स्वतंत्र है int, तो आपरेंड से कम रैंकिंग int

यह जोड़, घटाव और गुणा में सामान्य है। यह सामान्य रूप से विभाजन या मापांक के लिए सही नहीं है।


4

यदि आप अहस्ताक्षरित प्रकारों को बाहर करते हैं, तो एक क्रमबद्ध पदानुक्रम है: हस्ताक्षरित चार, लघु, इंट, लंबे, लंबे लंबे, फ्लोट, डबल, लंबे डबल। सबसे पहले, उपरोक्त में इंट से पहले आने वाली कोई भी चीज इंट में बदल जाएगी। फिर, एक बाइनरी ऑपरेशन में, कम रैंक वाले प्रकार को उच्च में परिवर्तित किया जाएगा, और परिणाम उच्च के प्रकार होंगे। (आप ध्यान देंगे कि, पदानुक्रम से, कभी भी एक अस्थायी बिंदु और एक अभिन्न प्रकार शामिल हैं, अभिन्न प्रकार को अस्थायी बिंदु प्रकार में बदल दिया जाएगा।)

अहस्ताक्षरित चीजों को थोड़ा जटिल करता है: यह रैंकिंग को गड़बड़ा देता है, और रैंकिंग के कुछ हिस्सों को परिभाषित किया जाता है। इस वजह से, एक ही अभिव्यक्ति में हस्ताक्षरित और अहस्ताक्षरित मिश्रण नहीं करना सबसे अच्छा है। (अधिकांश C ++ विशेषज्ञ तब तक अहस्ताक्षरित से बचने के लिए लगते हैं जब तक कि बिटवाइज़ ऑपरेशंस शामिल न हों। यानी, कम से कम, स्ट्रॉस्ट्रुप क्या सलाह देता है।)


3
स्ट्रॉस्ट्रप अनुशंसा कर सकता है कि वह क्या पसंद करता है, लेकिन intएक संख्या के लिए साइन-सक्षम का उपयोग करना, जिसे कभी भी नकारात्मक होने की आवश्यकता नहीं है, उपलब्ध सीमा के पूर्ण 50% की पूरी बर्बादी है। मैं निश्चित रूप से कोई स्ट्रॉस्ट्रुप नहीं हूं, लेकिन मैं unsignedडिफ़ॉल्ट रूप से उपयोग करता हूं और signedकेवल तभी जब मेरे पास कोई कारण हो।
अंडरस्कोर_ड

1
यह सब अच्छी तरह से और अच्छा है, अंडरस्कोर_ड, उस दिन तक जब आपको घटाना है। C ++ में अहस्ताक्षरित संख्याओं के साथ प्राथमिक समस्या यह है कि जब आप घटाव करते हैं, तो वे अहस्ताक्षरित रहते हैं। तो मान लीजिए कि आप एक फ़ंक्शन लिखते हैं, यह देखने के लिए कि क्या std :: वेक्टर क्रम में है। आप लिख सकते हैं bool in_order(vector<T> vec) { for ( int i = 0; i < size() - 1; ++i) { if (vec[i + 1] < vec[i]) return false; } return true;और फिर आप यह जानकर नाराज होंगे कि यह खाली वैक्टर के लिए दुर्घटनाग्रस्त हो गया क्योंकि आकार () - 1 रिटर्न 18446744073709551615.
jorgbrown

3

मेरे समाधान के लिए समस्या वाशिंगटन (गलत जवाब), तो मैं से एक बदला मिल गया intके लिए long long intऔर दे दिया एसी (स्वीकार) । पहले, मैं करने की कोशिश कर रहा था long long int += int * int, और बाद में मैंने इसे ठीक कर दिया long long int += long long int * int। Googling मैं के साथ आया था,

1. अंकगणितीय रूपांतरण

प्रकार रूपांतरण के लिए शर्तें:

शर्तें --- --- रूपांतरण

  • या तो ऑपरेंड टाइप डबल का है । ---> अन्य ऑपरेंड को लंबी डबल टाइप करने के लिए परिवर्तित किया जाता है ।

  • पूर्ववर्ती स्थिति पूरी नहीं हुई और या तो ऑपरेंड टाइप डबल का है । ---> अन्य ऑपरेंड को डबल टाइप करने के लिए परिवर्तित किया जाता है ।

  • पूर्ववर्ती स्थितियां पूरी नहीं हुईं और या तो ऑपरेंड टाइप फ्लोट का है । ---> अन्य ऑपरेंड फ्लोट प्रकार में परिवर्तित होता है ।

  • पूर्ववर्ती स्थितियां पूरी नहीं हुईं (कोई भी संचालन अस्थायी प्रकार का नहीं है)। --- - इंटीग्रल पदोन्नति को ऑपरेंड पर निम्नानुसार किया जाता है:

    • यदि कोई भी ऑपरेंड लंबे अहस्ताक्षरित प्रकार का होता है , तो दूसरा ऑपरेंड अहस्ताक्षरित प्रकार में परिवर्तित हो जाता है ।
    • यदि पूर्ववर्ती स्थिति पूरी नहीं हुई है, और यदि या तो ऑपरेंड प्रकार का लंबा है और दूसरे का प्रकार अहस्ताक्षरित int है , तो दोनों ऑपरेंड को बिना लंबे टाइप किए परिवर्तित किया जाता है ।
    • यदि पूर्ववर्ती दो शर्तों को पूरा नहीं किया गया है, और यदि कोई ऑपरेंड प्रकार का लंबा है , तो टी अन्य ऑपरेंड को लंबे समय तक परिवर्तित किया जाता है ।
    • यदि पूर्ववर्ती तीन शर्तों को पूरा नहीं किया गया है, और यदि ऑपरेंड या तो अहस्ताक्षरित int का है , तो अन्य operand को अहस्ताक्षरित int में परिवर्तित किया जाता है ।
    • यदि पूर्ववर्ती स्थितियों में से कोई भी पूरा नहीं किया जाता है, तो दोनों ऑपरेंड को इंट में टाइप किया जाता है ।

२। पूर्ण रूपांतरण नियम

  • पूर्णांक प्रचार:

जब कोई ऑपरेशन उन पर किया जाता है तो इंट से छोटे छोटे प्रकार को बढ़ावा दिया जाता है। यदि मूल प्रकार के सभी मूल्यों को एक इंट के रूप में दर्शाया जा सकता है, तो छोटे प्रकार के मूल्य को एक इंट में बदल दिया जाता है; अन्यथा, यह एक अहस्ताक्षरित int में बदल जाता है। पूर्ण तर्क के सामान्य अभिजात वर्ग रूपांतरणों के हिस्से के रूप में पूर्णांक पदोन्नति को लागू किया जाता है; संचालन +, -, और ~ ऑपरेटरों के; और शिफ्ट ऑपरेटरों के संचालन।

  • पूर्णांक रूपांतरण रैंक:

    • किसी भी दो हस्ताक्षरित पूर्णांक प्रकारों में समान रैंक नहीं होगी, भले ही उनका प्रतिनिधित्व एक ही हो।
    • एक हस्ताक्षरित पूर्णांक प्रकार की रैंक कम सटीकता के साथ किसी भी हस्ताक्षरित पूर्णांक प्रकार के रैंक से अधिक होगी।
    • की रैंक रैंक से long long intअधिक होगी long int, जो रैंक से intअधिक होगी, जो रैंक से short intअधिक होगी, जो रैंक से अधिक होगी signed char
    • किसी भी अहस्ताक्षरित पूर्णांक प्रकार की रैंक, यदि कोई हो, संबंधित हस्ताक्षरित पूर्णांक प्रकार के रैंक के बराबर होगी।
    • किसी भी मानक पूर्णांक प्रकार की रैंक समान चौड़ाई के साथ किसी भी विस्तारित पूर्णांक प्रकार के रैंक से अधिक होगी।
    • के पद के रैंक के charबराबर होगा signed charऔर unsigned char
    • किसी अन्य विस्तारित विस्तारित पूर्णांक प्रकार के सापेक्ष किसी भी विस्तारित हस्ताक्षरित पूर्णांक प्रकार के रैंक को उसी सटीकता के साथ क्रियान्वित-परिभाषित किया जाता है, लेकिन पूर्णांक रूपांतरण रैंक निर्धारित करने के लिए अन्य नियमों के अधीन है।
    • सभी पूर्णांक प्रकारों के लिए T1, T2 और T3, यदि T1 की T2 से अधिक रैंक है और T2 की T3 से अधिक रैंक है, तो T1 की T3 से अधिक रैंक है।
  • सामान्य अंकगणितीय रूपांतरण:

    • यदि दोनों ऑपरेंड में एक ही प्रकार है, तो आगे रूपांतरण की आवश्यकता नहीं है।
    • यदि दोनों ऑपरेंड एक ही पूर्णांक प्रकार (हस्ताक्षरित या अहस्ताक्षरित) के होते हैं, तो कम पूर्णांक कनवर्ज़न रैंक के प्रकार वाला ऑपरेंड अधिक रैंक वाले ऑपरेंड के प्रकार में परिवर्तित हो जाता है।
    • यदि किसी ऐसे पूर्णांक प्रकार वाले ऑपरेटर को अन्य ऑपरेंड के प्रकार के रैंक से अधिक या उसके बराबर रैंक दिया गया है, तो हस्ताक्षर किए गए पूर्णांक प्रकार वाले ऑपरेटर को बिना पूर्णांक प्रकार वाले ऑपरेटर के प्रकार में बदल दिया जाता है।
    • यदि हस्ताक्षरित पूर्णांक प्रकार के साथ ऑपरेंड का प्रकार अहस्ताक्षरित पूर्णांक प्रकार के साथ ऑपरेंड के प्रकार के सभी मूल्यों का प्रतिनिधित्व कर सकता है, तो अहस्ताक्षरित पूर्णांक प्रकार वाला ऑपरेटर हस्ताक्षरित पूर्णांक प्रकार के साथ ऑपरेटर के प्रकार में बदल जाता है।
    • अन्यथा, दोनों ऑपरेंड हस्ताक्षरित पूर्णांक प्रकार के साथ ऑपरेटर के प्रकार के अनुरूप अहस्ताक्षरित पूर्णांक प्रकार में परिवर्तित हो जाते हैं। विशिष्ट ऑपरेशन सामान्य अंकगणितीय ऑपरेशन के शब्दार्थ को जोड़ या संशोधित कर सकते हैं।

1

पूरे अध्याय 4 में रूपांतरणों के बारे में बात की गई है, लेकिन मुझे लगता है कि आपको इनमें से ज्यादातर में दिलचस्पी लेनी चाहिए:

4.5 इंटीग्रल प्रमोशन [conv.prom]
प्रकार के चार, हस्ताक्षरित चार, अहस्ताक्षरित चार, लघु int, या अहस्ताक्षरित लघु int का एक प्रकार, प्रकार int के एक प्रकारांतर में परिवर्तित किया जा सकता है अगर int स्रोत प्रकार के सभी मूल्यों का प्रतिनिधित्व कर सकता है; अन्य-
वार, स्रोत rvalue को अहस्ताक्षरित int के प्रकार में बदला जा सकता है।
टाइप wchar_t (3.9.1) या एन्यूमरेशन टाइप (7.2) के एक
प्रकार को निम्नलिखित प्रकारों में से एक के प्रकार में बदला जा सकता है जो इसके अंतर्निहित प्रकार के सभी मूल्यों का प्रतिनिधित्व कर सकते हैं: int, अहस्ताक्षरित int,
लंबा, या अहस्ताक्षरित। लंबा।
एक इंटीग्रल बिट-फील्ड (9.6) के लिए एक रैक को टाइप इंट के रिवेल्यू में बदला जा सकता है यदि इंट
बिट-फील्ड के सभी मूल्यों का प्रतिनिधित्व कर सकता है ; अन्यथा, इसे अहस्ताक्षरित int में बदला जा सकता है यदि अहस्ताक्षरित int दोहरा सकते हैं-
बिट-फ़ील्ड के सभी मूल्यों को नाराज करें। यदि बिट-फ़ील्ड अभी तक बड़ा है, तो कोई भी अभिन्न पदोन्नति उस पर लागू नहीं होती है। यदि
बिट-फ़ील्ड में एक एन्यूमरेटेड प्रकार है, तो इसे प्रचार उद्देश्यों के लिए उस प्रकार के किसी भी अन्य मान के रूप में माना जाता है।
प्रकार के बूल का एक प्रकार, प्रकार के अंतर के एक प्रचलन में परिवर्तित किया जा सकता है, जिसमें झूठ शून्य और सच
एक हो जाता है।
इन रूपांतरणों को अभिन्न प्रचार कहा जाता है।

4.6 फ़्लोटिंग पॉइंट प्रमोशन [conv.fpprom]
टाइप फ़्लोट के एक प्रकार को डबल के एक प्रकार में बदला जा सकता है। मान अपरिवर्तित है।
इस रूपांतरण को फ्लोटिंग पॉइंट प्रमोशन कहा जाता है।

इसलिए, फ्लोट से जुड़े सभी रूपांतरण - परिणाम फ्लोट है।

केवल दोनों int शामिल हैं - परिणाम int: int / int = int है


1

अभिव्यक्ति का प्रकार, जब दोनों भाग एक ही प्रकार के नहीं होते हैं, दोनों में से सबसे बड़े में परिवर्तित हो जाएंगे । यहाँ समस्या यह समझने की है कि कौन सा दूसरे से बड़ा है (इसका बाइट्स में आकार से कोई लेना देना नहीं है)।

उन भावों में जिनमें एक वास्तविक संख्या और एक पूर्णांक संख्या शामिल है, पूर्णांक को वास्तविक संख्या में पदोन्नत किया जाएगा। उदाहरण के लिए, इंट + फ्लोट में, अभिव्यक्ति का प्रकार फ्लोट है।

अन्य अंतर प्रकार की क्षमता से संबंधित हैं। उदाहरण के लिए, एक int और एक लंबे int को शामिल करने वाला एक अभिव्यक्ति प्रकार का परिणाम देगा int।


2
यह सच नहीं है। प्लेटफार्मों पर एक long"से बड़ा" हो सकता है floatलेकिन किस प्रकार का long+ है float?
सीबी बेली

1
-1: आपका सबसे बड़ा मतलब क्या है ? क्या एक फ्लोट इंट से बड़ा है? या इसके विपरीत ?
पॉल आर

2
आपकी टिप्पणीयों के लिए धन्यवाद। यहां बाइट्स में साइज कम करें, इसमें कोई दिलचस्पी नहीं है। जैसा कि यह सामने आता है, जाहिर है कि इटैलिक में सबसे बड़ा जवाब देने के लिए पर्याप्त नहीं है। वैसे भी, इसे अधिक गहराई से समझाने का कोई मतलब नहीं है, क्योंकि अब अन्य, बहुत गहन उत्तर हैं।
Baltasarq

-2

चेतावनी!

रूपांतरण बाएं से दाएं होते हैं।

इसे इस्तेमाल करे:

int i = 3, j = 2;
double k = 33;
cout << k * j / i << endl; // prints 22
cout << j / i * k << endl; // prints 0

9
वह धर्मांतरण के कारण नहीं बल्कि संचालक पूर्वता के कारण है। j + i * k101 में परिणाम होगा।
गार्टनरीज़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.