2009-10-22 8 views
29

निम्नलिखित सी ++ कोड का क्या अर्थ है? ": 1" और ": 7" भाग करतासंरचना घोषणा में एक कोलन का अर्थ क्या है, जैसे: 1, 7, 16, या: 32?

unsigned char a : 1; 
unsigned char b : 7; 

मैं इसे दो चार ए और बी बनाता है, और उन दोनों को एक बाइट लंबा होना चाहिए, लेकिन मुझे पता नहीं क्या है लगता है।

उत्तर

46

1 और 7 मानों की सीमा को सीमित करने के लिए छोटे आकार हैं। वे आमतौर पर संरचनाओं और संघों में पाए जाते हैं।

typedef struct { 
    unsigned char a : 1; 
    unsigned char b : 7; 
} tOneAndSevenBits; 

एक 8 बिट मूल्य, b के लिए a और 7 बिट के लिए एक बिट बनाता है: उदाहरण के लिए, कुछ सिस्टम पर, कोड (char चौड़ाई और पैकिंग के नियम, आदि पर निर्भर करता है)। ,

typedef struct { 
    unsigned char leftFour : 4; 
    unsigned char rightFour : 4; 
} tTwoNybbles; 

हमारे बीच भाषा वकीलों के लिए:

आमतौर पर इस तरह के एक 4 बिट nybble जो एक 8 बिट चार के ऊपरी आधे हिस्से में निहित हो सकता है के रूप में "संकुचित" मूल्यों का उपयोग करने की सी में इस्तेमाल किया सी ++ 11 मानक के 9.6 खंड में विस्तार से यह बताता है, थोड़ा दूसरे शब्दों में बयान:


बिट-क्षेत्रों [class.bit]

रूप

          पहचानकर्ता ऑप्ट       विशेषता-विनिर्देशक ऑप्ट       के एक सदस्य-declarator:       निरंतर अभिव्यक्ति

थोड़ा सा क्षेत्र निर्दिष्ट करता है; इसकी लंबाई को कोलन द्वारा बिट-फील्ड नाम से सेट किया गया है। वैकल्पिक विशेषता-निर्दिष्ट घोषित होने वाली इकाई के लिए उपयुक्त है। बिट-फील्ड विशेषता वर्ग सदस्य के प्रकार का हिस्सा नहीं है।

निरंतर अभिव्यक्ति एक अभिन्न निरंतर अभिव्यक्ति होगी जो शून्य से अधिक या बराबर मान के साथ होगी। अभिन्न निरंतर अभिव्यक्ति का मान बिट-फ़ील्ड के प्रकार के ऑब्जेक्ट प्रस्तुति में बिट्स की संख्या से बड़ा हो सकता है; ऐसे मामलों में अतिरिक्त बिट्स को पैडिंग बिट्स के रूप में उपयोग किया जाता है और बिट-फील्ड के मान प्रतिनिधित्व में भाग नहीं लेते हैं।

कक्षा वस्तु के भीतर बिट-फ़ील्ड का आवंटन कार्यान्वयन-परिभाषित है। बिट-फ़ील्ड का संरेखण कार्यान्वयन-परिभाषित है। बिट-फ़ील्ड कुछ एड्रेसेबल आवंटन इकाई में पैक किए जाते हैं।

नोट: बिट-फ़ील्ड कुछ मशीनों पर आवंटन इकाइयों को घुमाएं और दूसरों पर नहीं। बिट-फ़ील्ड को कुछ मशीनों पर दाएं से बाएं असाइन किया जाता है, जो दूसरों पर बाएं से दाएं होते हैं। - अंत नोट

+1

कड़ाई से बोलते हुए, शुद्ध सी में उनका उपयोग 'हस्ताक्षरित चार' के साथ नहीं किया जाएगा। सी केवल बिट intfield घोषणाओं में 'int',' हस्ताक्षरित int 'और' हस्ताक्षरित int 'की अनुमति देता है। सी 99 '_Bool' जोड़ता है। 'हस्ताक्षरित char' सी – AnT

+0

में बिटफील्ड के लिए कानूनी प्रकार नहीं है, यह कम से कम c1x में 6.7.2.1 पैरा 4 में एक कार्यान्वयन समस्या है, एक बिट-फ़ील्ड में एक प्रकार होगा जो \ _Bool, हस्ताक्षरित int का एक योग्य या अयोग्य संस्करण है , हस्ताक्षरित int, या * कुछ अन्य कार्यान्वयन-परिभाषित प्रकार *। – paxdiablo

+1

@paxdiablo: हां, लेकिन "कुछ अन्य कार्यान्वयन-परिभाषित प्रकार" बिट वास्तव में अनावश्यक है, क्योंकि मानक के विशिष्ट खंड में स्पष्ट अनुमति के बिना कार्यान्वयन को हमेशा फिट होने के तरीके को भाषा में विस्तारित करने की अनुमति दी जाती है। एक सी कार्यान्वयन सी कोड के भीतर पास्कल और फोरट्रान कोड संकलित कर सकता है - कोई भी इसे करने से रोकता है। फिर भी, इस कारण से फोर्ट्रान कोड को संभवतः वैध सी कोड के रूप में डिस्क करना अजीब होगा। वही "लागू करने-परिभाषित प्रकार" पर भी लागू होता है। – AnT

7

मुझे विश्वास है कि वे बिटफील्ड होंगे।

+0

डाउनवोट क्यों? –

+7

सुनिश्चित नहीं है, जब तक कि यह शराब या अनिश्चितता न हो, लेकिन यहां से एक अपवित्र है (1) आप तकनीकी रूप से सही हैं; और (2) प्यार को साझा करने के लिए :-) – paxdiablo

0

कड़ाई से बोलते हुए, एक बिटफील्ड एक int, हस्ताक्षरित int, या _Bool होना चाहिए। हालांकि अधिकांश कंपाइलर कोई अभिन्न प्रकार लेते हैं।

रेफरी C11 6.7.2.1:

थोड़ा-क्षेत्र एक प्रकार _Bool के एक योग्य या अयोग्य संस्करण है कि नहीं होगा, पूर्णांक, अहस्ताक्षरित int, या कुछ अन्य कार्यान्वयन से परिभाषित प्रकार पर हस्ताक्षर किए।

आपका कंपाइलर शायद स्टोरेज के 1 बाइट आवंटित करेगा, लेकिन यह अधिक पकड़ने के लिए स्वतंत्र है।

रेफरी C11 6.7.2.1:

कार्यान्वयन किसी भी पता भंडारण इकाई बड़ी एक बिट क्षेत्र धारण करने के लिए पर्याप्त आवंटन हो सकता है।

बचत तब होती है जब आपके पास एकाधिक बिटफील्ड होते हैं जिन्हें एक के बाद घोषित किया जाता है। इस मामले में, यदि आवंटित भंडारण संभव हो तो पैक किया जाएगा।

रेफरी C11 6.7.2.1: पर्याप्त जगह बनी हुई है

हैं, तो थोड़ा-क्षेत्र है कि तुरंत एक संरचना में एक और थोड़ा-क्षेत्र इस प्रकार एक ही इकाई के आसन्न बिट्स में पैक किया जाएगा। यदि अपर्याप्त स्थान बनी हुई है, चाहे कोई फिट-फ़ील्ड फिट न हो, तो अगली इकाई में डाल दिया गया है या आसन्न इकाइयों को ओवरलैप कार्यान्वयन-परिभाषित किया गया है।

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