2012-01-17 12 views
5

के साथ डेटा की लंबाई को निर्दिष्ट मैं इस वाक्य रचना जो मैंC++ डेटा प्रकार घोषणा

struct A { 
    int x:24; 
}; 

से पहले नहीं देखा है में आए x क्या करता है: 24 मतलब है? सी ++ में आप संकलक निर्दिष्ट कर सकते हैं कि एक चर को एक प्रकार के लिए 32 के बजाय केवल 24 बिट्स पर कब्जा करना चाहिए? यदि हां, तो 24 बिट्स पर कब्जा कर लिया जाएगा? सबसे अधिक बाएं सबसे दाएं या दाएं?

+0

एक्स एक बहुत ही उत्सुक int बना देगा यदि यह मानक सिस्टम int का एमएसबी हिस्सा था। –

उत्तर

6

यह bit fields feature है। यह शुरुआती सी दिनों से उपलब्ध है। माइक्रोसॉफ्ट के पास a nice write-up on this feature है, जो लेआउट दिखाते हुए सुंदर चित्रों के साथ पूर्ण है जो संकलक-विशिष्ट है (वे कहते हैं कि तस्वीर एमएस के लिए विशिष्ट है)।

+2

हस्ताक्षरित: 0; क्या एक दिलचस्प विशेषता है जिसे मैंने पहले महसूस नहीं किया था। –

+0

लेकिन ध्यान दें कि सुंदर चित्र केवल वर्णन करते हैं कि माइक्रोसॉफ्ट ने इसे कैसे कार्यान्वित करना चुना; सामान्य रूप से, लेआउट कार्यान्वयन परिभाषित किया गया है। –

+0

@ माइकसेमोर आप बिल्कुल सही हैं: यह बहुत ही बिंदु मेरे संपादन का विषय था। – dasblinkenlight

4

यह वही है जो आपको लगता है कि इसे बिट फ़ील्ड कहा जाता है। x में 24 बिट उपलब्ध है।

// standard 32bit integer: 
0000 0000 0000 0000 0000 0000 0000 0000 
// x (24 bit): 
0000 0000 | 0000 0000 0000 0000 0000 0000 
//  ^-- cut off here 
// other 8 bit available for other uses, for example: 

struct A{ 
    int x : 24; 
    int y : 8; 
}; // sizeof(A) == sizeof(int) (most likely on 32bit architecture) 

ध्यान दें कि संरचना अभी भी 32 बिट (या 4 बाइट) बड़ी होगी, क्योंकि आप केवल उन अतिरिक्त बिट को काट नहीं सकते हैं। इस प्रकार, बिट फ़ील्ड अधिकतर उपयोगी होते हैं जब आपके पास बहुत तंग स्पेस आवश्यकताएं है और जितनी संभव हो उतनी छोटी जगह जितनी संभव हो उतनी जानकारी पैक करने की आवश्यकता होती है।

+0

यदि आप अनुमान के साथ विस्तृत करना चाहते हैं; क्या संकलक इन परिदृश्यों में एक मुखौटा + बिट्सफिफ्ट कार्यान्वित करता है? (बिट्सफ़िफ्ट) –

+1

@ कैप्टन जीराफ: सबसे अधिक संभावना है। हार्डवेयर स्तर पर, आप आईआईआरसी के किसी अन्य तरीके से शब्दों को अलग नहीं कर सकते हैं। हालांकि, यह ध्यान रखना दिलचस्प है कि एक बिट फ़ील्ड से किसी भी ओवरफ्लो किसी अन्य बिट फ़ील्ड को प्रभावित नहीं करते हैं (यदि 'x' ओवरफ़्लो होगा, तो 'y' नहीं बदलेगा) (इस तथ्य के अलावा कि इस मामले में ओवरफ़्लो होगा अपरिभाषित व्यवहार क्योंकि 'x' हस्ताक्षरित है ...)। – Xeo

+0

उपरोक्त आपके उदाहरण में, int x: 24 के बाद एक पैडिंग होगा, int को 32 बिट्स पर गठबंधन रखने के लिए या परिवर्तनीय एक्स से शेष 8 बिट्स को वैरिएबल वाई के लिए मान में भरने के लिए उपयोग किया जाएगा? – Jimm

4

यदि हां, तो 24 बिट्स पर कब्जा कर लिया जाएगा? सबसे अधिक बाएं सबसे दाएं या दाएं?

यह सी ++ मानक में अनिर्दिष्ट है (§9.6/1: बिट-क्षेत्रों सही-से-बाएँ कुछ मशीनों पर, बाएँ-से-दाएँ दूसरों पर आवंटित कर रहे हैं)।

आमतौर पर यह मंच की समाप्ति पर निर्भर करता है। एक छोटे-endian मंच पर यह के रूप में भरा जाना होगा:

[ bits 0~7 ] [ bits 8~15 ] [ bits 16~23 ] [ bits 24~31 ] 
----------------------------------------- -------------- 
        x       (padding) 

और बड़े endian मंच

[ bits 0~7 ] [ bits 8~15 ] [ bits 16~23 ] [ bits 24~31 ] 
------------ ------------------------------------------- 
    (padding)      x 
+0

कंपाइलर बिट फ़ील्ड के साथ एक संरचना को संरेखित कैसे करता है? क्या यह केवल स्ट्रक्चर के अंत में पर्याप्त बिट्स पैड करेगा, ताकि 32 बिट प्लेटफ़ॉर्म के लिए 32 बिट्स पर गठबंधन किया जा सके? क्या होगा अगर किसी स्ट्रक्चर में int x: 8 और एक और नियमित फ़ील्ड int y जैसे फ़ील्ड हों; इस उदाहरण में पैडिंग कहाँ लागू की जाएगी? – Jimm

+0

@ जिम: आप [link] (http://msdn.microsoft.com/en-us/library/ewwyfdbe%28v=vs.100%29.aspx) देख सकते हैं [@dasblinkenlight] द्वारा प्रदान किया गया (http://stackoverflow.com/a/8900155/224671) – kennytm

1

बिट्स के आदेश सीपीयू निर्भर होगा में उलट। हो सकता है कि आप इस क्षेत्र में 1 की तरह कुछ सरल लिख सकें और फिर डीबगर में मेमोरी शब्द देखें।

+0

मैं कल्पना करता हूं कि संकलक यहां भारी भारोत्तोलन कर रहे हैं, सीपीयू नहीं। –

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