हमें निम्न कोड पर विचार करें
#include & lt; stdio.h & gt; # शामिल करें & lt; iostream & gt; नेमस्पेस एसटीडी का उपयोग करना; Typedef struct bf_ {अहस्ताक्षरित x: 4; अहस्ताक्षरित y: 4; अहस्ताक्षरित z: 4; अहस्ताक्षरित w: 4; } BF के; Int main () {अहस्ताक्षरित छोटा मैं = 8; अहस्ताक्षरित छोटा जे = 9; बीएफ * बिटफ़ेल्ड = (बीएफ *) & amp; i; BF के * बिट = (BF के *) & amp; j; bitfields- & gt; डब्ल्यू 12 =; printf ( "% d \ n", bitfields- & gt; एक्स); printf ( "% d \ n", बिट & gt; y); printf ( "% d \ n", bitfields- & gt; डब्ल्यू); वापसी 0; }
यह टुकड़ा
अहस्ताक्षरित छोटा जे = 9; BF के * बिट = (BF के *) & amp; j; printf ( "% d \ n", बिट & gt; y);
मैंने इस जगह के उदाहरण के लिए इस कोड के कुछ रोचक विशेषता का अनुमान लगाया है
bf * bitfields = (bf *) & amp; i;
जब हम printf ("% d \ n", bitfields- & gt; x) लिखते हैं;
जो प्रिंट करता है 8 मैं समझता हूं कि पॉइंटर्स और संदर्भों का उपयोग करके I इसे एक्स के लिए दिया जाएगा और इसलिए यह 8 के लिए छापेगा जब हम bitfiled-> y
लिखते हैं, तो लिखते हैं, इसलिए मैंने दूसरा एलिमेंट व्हेरिएबल को शुरू करने का निर्णय लिया है जो कि बीएफ संरचना का नया उदाहरण बना और जम्मू के संदर्भ में जिसके बाद बयान-> y 9 लिखना चाहिए क्योंकि मैं समझता हूं कि यह आदेश की परिभाषा है लेकिन यह मुझे क्यों देता है? कृपया मुझे बताएं कि यह कोड कैसे काम करता है? मैं अंग्रेजी बोलने वाला नहीं हूं इसलिए कृपया मेरे खराब अंग्रेजी के लिए खेद है
पहले सभी में, इस कोड में कोई संदर्भ नहीं है। जब और
" i
का पता", i
"के संदर्भ में नहीं " है।
मुझे यकीन नहीं है कि आपको यह विचार क्यों मिल रहा है कि मान 9 का उपयोग कर रहा है जैसा कि आपके bf
स्ट्रैट को y
के कारण मान 9
। जब आप इसे लिखते हैं:
bf * bitfields = (bf *) & amp; i;
क्या होता है कि आप कंपाइलर को कह रहे हैं "स्मृति स्थान & amp; i
पर मान का इलाज करें जैसे कि यह एक bf
संरचना "। bf
संरचना को परिभाषित किया जाता है, ताकि कम से कम महत्वपूर्ण (दाएं-सबसे) बिट्स से शुरू हो, पहले चार बिट्स x
मान हैं, दूसरे चार बिट्स < कोड> वाई मान, तीसरे चार बिट्स हैं z
मान, आदि।
इसलिए जब स्थान 8
है, और 8 में 16-बिट बाइनरी है
0000 0000 0000 1000
के क्षेत्र बिटफ़ील्ड
होने जा रहा है:
0000 0000 0000 1000 wzyx
तो x
का मान (a 4-बिट अहस्ताक्षरित पूर्णांक) 8 है, जबकि y
, z
, और w
के मान 0 हैं।
उस मामले में जहां आप लिखते हैं
bf * bit = (bf *) & j;
आप ऊपर की तरह एक ही काम कर रहे हैं, सिवाय अब मान 9 है, इसलिए असाइनमेंट हैं:
0000 0000 0000 1001 wzyx
तो x
में मान 9 है, और अन्य मान अभी भी 0 है।
यदि आप 9 को y असाइन करना चाहते हैं
, असाइनमेंट को इस तरह दिखना होगा: x
के बजाय
0000 0000 1001 0000 wzyx
तो आपके द्वारा उपयोग किए जाने वाले मान 16-बिट बाइनरी प्रस्तुति के साथ मूल्य है
0000 0000 1001 0000
कौन सी 144 है। इसलिए यदि आप j = 144
के बजाय j = 9
दें, आप देखेंगे कि bit-> y
9 और अन्य सभी फ़ील्ड में बिट
0 है।
Comments
Post a Comment