2012-12-10 41 views
14
क्या है

संभव डुप्लिकेट:
Practical Use of Zero-Length Bitfieldsशून्य चौड़ाई सा क्षेत्र

क्यों कुछ संरचनाओं शून्य चौड़ाई बिट क्षेत्रों, और क्यों यह आवश्यक है है?

struct foo { 
    int a:3; 
    int b:2; 
    int  :0; // Force alignment to next boundary. 
    int c:4; 
    int d:3; 
}; 

int main() 
{ 
     int i = 0xFFFF; 
     struct foo *f = (struct foo *)&i; 
     printf("a=%d\nb=%d\nc=%d\nd=%d\n", f->a, f->b, f->c, f->d); 
     return 0; 
} 

उपरोक्त कार्यक्रम के उत्पादन

[email protected]:~/programs/test$ ./a.out 
a=-1 
b=-1 
c=-8 
d=0 

कृपया बताएं कि इन मूल्यों को नकारात्मक हैं, और संरचना के भीतर इनके स्मृति लेआउट है?

+1

यह माइक्रोसॉफ्ट के जवाब है, मैं तुम्हें एक बार देख ले सुझाव देते हैं। 71) .aspx, यहां तक ​​कि, संरेखण हमेशा संकलक निर्भर है। –

+0

संरचना { int a: 3; int बी: 2; int: 0; int सी: 4; int डी: 3; }; जो 000aaabb 0ccccddd के बिना लेआउट देगा: 0; 0000aaab bccccddd 0 चौड़ाई फ़ील्ड बताता है कि निम्नलिखित बिटफील्ड अगले परमाणु इकाई (चार) पर सेट किए जाने चाहिए। बिट फ़ील्ड्स के रूप में घोषित डेटा का क्रम निम्न से उच्च बिट तक है, या आपके आर्किटेक्चर के आधार पर अन्य तरीका है। –

उत्तर

8

this first hit on a Google search से:

0 की लंबाई के साथ

बिट क्षेत्रों अनाम होना चाहिए। अनाम क्षेत्रों को संदर्भित या प्रारंभ नहीं किया जा सकता है। शून्य-चौड़ाई वाला बिट फ़ील्ड अगले कंटेनर सीमा पर अगले फ़ील्ड को गठबंधन कर सकता है जहां कंटेनर बिट फ़ील्ड के अंतर्निहित प्रकार के समान आकार है।

अपने प्रश्न के दूसरे भाग के रूप में, आप सभी 1s करने के लिए अपने struct में bitfields के कुछ निर्धारित करते हैं, और के बाद से इन क्षेत्रों पर हस्ताक्षर किए हैं, फिर इस इन क्षेत्रों के लिए एक नकारात्मक मूल्य का परिणाम है। यदि आप पूरी संरचना को 1s पर सेट करते हैं और हस्ताक्षरित और हस्ताक्षरित दोनों प्रस्तुतियों में मानों को देखते हैं, तो आप इसे अधिक प्रभावी ढंग से देख सकते हैं।

int main() 
{ 
    struct foo f; 
    memset(&f, 0xff, sizeof(f)); 
    printf("a=%d\nb=%d\nc=%d\nd=%d\n", f.a, f.b, f.c, f.d); // print fields as signed 
    printf("a=%u\nb=%u\nc=%u\nd=%u\n", f.a, f.b, f.c, f.d); // print fields as unsigned 
    return 0; 
} 
3

मेमोरी लेआउट "यह निर्भर करता है" और आप किसी विशेष कंपाइलर से किसी विशेष लेआउट पर भरोसा नहीं कर सकते हैं। वास्तव में, आप अपनी सेटिंग्स को बदलकर किसी दिए गए कंपाइलर से अलग लेआउट देख सकते हैं। अनुमान लगाने, अंतर्ज्ञान, या लेआउट पर निर्भर करने की कोशिश मत करो।

नकारात्मक - आपके सभी तत्व int एस हैं जो हस्ताक्षरित हैं, इसलिए वे नकारात्मक हैं क्योंकि आपने प्रत्येक बिट को 1 से शुरू किया है, इसलिए आपको साइन बिट सेट मिल गए हैं। डी के लिए - मुझे धड़कता है। लेखन त्रुटि है?

+0

आपने प्रश्न के मुख्य भाग का जवाब नहीं दिया - शून्य चौड़ाई बिटफील्ड का उद्देश्य क्या है? –

1

संख्या नकारात्मक हैं क्योंकि बिटफील्ड पर हस्ताक्षर किए गए हैं, यानी यदि आपके पास signed char चर है, तो इसका आकार 8 बिट्स है जो 256 विभिन्न मान रख सकता है। मूल्यों में से आधे सकारात्मक हैं, बाकी नकारात्मक हैं और 0. सबसे महत्वपूर्ण बिट संकेत इंगित करता है (नकारात्मक के लिए 1, सकारात्मक के लिए 0)। शून्य-लंबाई बिटफील्ड के बारे में यहां देखें: Practical Use of Zero-Length Bitfields

2

जैसा कि here कहा गया है, शून्य-लंबाई बिटफील्ड बिटफील्ड के बीच संरेखण जोड़ते हैं। यदि हमारे पास पंक्ति में कई बिटफील्ड हैं, तो उनका लेआउट कॉम्पैक्ट है, लेकिन अगर हम उनमें से एक को बाइट/शब्द/डवर्ड सीमा पर संरेखित करना चाहते हैं, तो हमें इस और पिछले एक के बीच शून्य-लंबाई बिटफील्ड डालना होगा। ऊपर के लिंक से

उदाहरण: http://msdn.microsoft.com/en-us/library/ewwyfdbe(v=vs:

struct on_off { 
        unsigned light : 1; 
        unsigned toaster : 1; 
        int count;   /* 4 bytes */ 
        unsigned ac : 4;  // this and 
        unsigned : 4;  // this and 
        unsigned clock : 1; // this bitfields are next to each other 
        unsigned : 0; 
        unsigned flag : 1; // this bitfield is at a 4 bytes boundary. 
       } kitchen ;