2012-08-07 11 views
7

कार्यक्रम है:प्रिंट बिट प्रकार पूर्णांक के रूप में? रूपांतरण कैसा है?

typedef struct xp { 
     int a:2; 
     int b:2; 
     int c:1; 
} xp; 

int main(void) 
{ 
     xp x; 
     memset(&x, 0, sizeof(xp)); 

     x.a = 1; 
     x.b = 3; 
     x.c = 1; 

     printf("%d\n",x.a); 
     printf("%d\n",x.b); 
     printf("%d\n",x.c); 

     return 0; 
} 

मैं 1 -1 -1 मिलता है, क्यों? एक्स, बी और सी एक्स में संग्रहीत कैसे हैं? क्या हुआ जब printf ("% d \ n", x.a); निष्पादित किया जाता है?

+0

यह एक डुप्लिकेट है; मुझे पता है मैंने एक बार पहले इस सवाल का जवाब दिया था। मैं देखूंगा कि मैं इसे ट्रैक कर सकता हूं या नहीं। –

+0

जब तक कार्ल डुप्ली नहीं पाता: क्योंकि आपका कंपाइलर बिट-फ़ील्ड को दो-पूरक संख्या के रूप में व्याख्या करता है। –

+2

यह वास्तव में कार्यान्वयन-परिभाषित है कि क्या वे हस्ताक्षरित हैं या हस्ताक्षरित हैं। –

उत्तर

5

आप अपने बिटफील्ड के लिए एक हस्ताक्षरित प्रकार का उपयोग कर रहे हैं, जिसका अर्थ है कि आपने दो दो-बिट हस्ताक्षरित पूर्णांक, और एक-बिट हस्ताक्षरित पूर्णांक की मात्रा बनाई है।

एक दो बिट के साइन्ड इंटीजर (दो का पूरक) के लिए संभावित मान हैं: -2, -1, 0, और 1:

एक एक बिट के साइन्ड इंटीजर (दो का पूरक) के लिए संभावित मान हैं -1 और 0.

मूल्यों भंडारण है कि "फिट नहीं है", जैसे आप इन पंक्तियों में किया है द्वारा:

x.b = 3; 
x.c = 1; 

आप बिट पैटर्न आप की दुकान के रूप में अजीब व्यवहार मिल जाएगा अलग ढंग से जब समझा जाता है पढ़ें। आप की तरह कुछ कर रही द्वारा एक समान अनुभव हो सकता है: एक 8 बिट char प्रकार के साथ एक मशीन पर

char x = 58147; 

, कि मूल्य फिट नहीं होगा, ताकि आप कुछ अलग वापस जब x तक पहुँचने पढ़ेंगे।

+0

@ccsnailpp, यह -1 है क्योंकि यह दो का पूरक है। अग्रणी बिट 1 है, इसका मतलब है कि यह एक नकारात्मक संख्या है। संबंधित सकारात्मक संख्या में अनुवाद करने के लिए, '~ x + 1' करें। इस मामले में यह '~ 11 + 1 = 00 + 1 = 1' है।दो के पूरक में, एक सभी बिट पैटर्न हमेशा -1 का प्रतिनिधित्व करता है। –

+0

विस्तार से आपकी व्याख्या के लिए धन्यवाद। –

2

int का थोड़ा सा क्षेत्र signed int या unsigned int टाइप करें। पसंद कार्यान्वयन-परिभाषित है। यह ऐतिहासिक कारणों से है। यह एकमात्र संदर्भ है जिसमें int और signed int भिन्न हो सकते हैं।

यह, सी मानक (C99 draft, C11 draft) की धारा 6.7.2 में निर्दिष्ट किया जाता प्रकार विनिर्देशक की एक सूची निम्नलिखित:, छोड़कर

अल्पविराम से अलग multisets से प्रत्येक एक ही प्रकार निर्दिष्ट करता है कि बिट-फ़ील्ड के लिए, यह कार्यान्वयन-परिभाषित किया गया है कि निर्दिष्ट intsigned int या उसी प्रकार unsigned int के समान प्रकार को निर्दिष्ट करता है।

समाधान बिट फ़ील्ड के लिए सादे int का उपयोग करने से बचने के लिए है; हमेशा उन्हें signed int या unsigned int के रूप में घोषित करें। (उत्तरार्द्ध लगभग हमेशा अधिक समझ में आता है।)

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