5

मान लीजिए कि मैं struct निम्नलिखित है दो:क्या आकार में int से कम बिट फ़ील्ड अभिन्न पदोन्नति का विषय होना चाहिए?

struct A 
{ 
    unsigned int a : 1; 
    unsigned int b : 1; 
}; 

क्या मुझे दिलचस्पी अभिव्यक्ति a + b का प्रकार है। तकनीकी रूप से बिट-फ़ील्ड में int से कम आकार के साथ "टाइप" होता है, इसलिए अभिन्न पदोन्नति शायद होनी चाहिए और फिर परिणाम int है जैसे यह जीसीसी और क्लैंग में होता है।

लेकिन चूंकि सटीक प्रकार के बिट-फील्ड को निकालना असंभव है और इसे हमेशा इस "मामले में" बड़ा "प्रकार (यानी unsigned int) के रूप में घटाया जाएगा) क्या यह सही है कि अभिन्न पदोन्नति होनी चाहिए? क्योंकि हम वास्तव में unsigned int के रूप में कटौती किए जाने के अलावा सटीक प्रकारों और बिट-फ़ील्ड के लिए उनके आकारों के बारे में बात नहीं कर सकते हैं, इस मामले में अभिन्न पदोन्नति नहीं होनी चाहिए।

5 यह कहता है

+0

दृश्य स्टूडियो का कौन सा संस्करण, संभवतः उस टैग को जोड़ने के लिए यह समझ में आता है कि अन्य लोगों के पास एक ही समस्या है –

+0

@ShafikYaghmour यह नवीनतम है लेकिन मैंने इसे मामले में जोड़ा। – Predelnik

+0

यह भी प्रासंगिक है: [सी और सी ++ में अंकगणितीय परिचालन से पहले एक छोटा सा रूपांतरित क्यों होना चाहिए?] (Http://stackoverflow.com/q/24371868/1708801) –

उत्तर

4

अगर हम draft C++ standard: N4140 अनुभाग पर जाएँ (एक बार फिर से मेरे सवाल का तथ्य यह है कि MSVC को लगता है कि इस तरह के unsigned int अभिव्यक्ति के प्रकार है होता है की वजह से उपजी):

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

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

  • अन्यथा, अभिन्न प्रोन्नति (4.5) दोनों ऑपरेंड पर प्रदर्शन किया जाएगा। 61 तब निम्नलिखित नियम पदोन्नत ऑपरेंड के लिए लागू किया जाएगा:

और संप्रदाय आयन 4.5 जो कहते हैं (जोर मेरा):

एक अभिन्न सा मैदान (9.6) के लिए एक prvalue प्रकार int के prvalue में बदला जा सकता है, तो पूर्णांक बिट के सभी मूल्यों का प्रतिनिधित्व कर सकते हैं -खेत; अन्यथा, अगर हस्ताक्षर किए गए int बिट-फ़ील्ड के सभी मानों का प्रतिनिधित्व कर सकते हैं तो इसे हस्ताक्षरित int में परिवर्तित किया जा सकता है। यदि बिट-फील्ड बड़ा है, तो इसमें कोई अभिन्न प्रचार लागू नहीं होता है। यदि बिट-फ़ील्ड में एक समेकित प्रकार है, तो इसे प्रचार उद्देश्यों के लिए उस प्रकार के किसी भी अन्य मान के रूप में माना जाता है।

तो जीसीसी और बजना सही, a और b int करने के लिए प्रोत्साहित किया जाना चाहिए।

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