C99 मानक (§6.7.2.1.14) का कहना है:
एक संघ का आकार अपने सदस्यों में से सबसे बड़ी को रोकने के लिए पर्याप्त है। पर मूल्य का अधिकांश सदस्यों को किसी भी समय यूनियन ऑब्जेक्ट में संग्रहीत किया जा सकता है। यूनियन ऑब्जेक्ट के लिए एक सूचक, उपयुक्त रूप से परिवर्तित, अपने प्रत्येक सदस्यों को (या यदि कोई सदस्य थोड़ा- फ़ील्ड है, फिर उस इकाई में जिसमें वह रहता है), और इसके विपरीत।
(जोर जोड़ा)
साहसिक बयान वास्तव में कहते हैं संघ के प्रत्येक सदस्य को एक ही पता होता है, तो वे सब एक ही पते पर "शुरू" कि। t
, t.ch
t.i
के रूप में, पता 2000 पर होना चाहिए, इस प्रकार t.ch
t.i
के पहले बाइट (पता क्रम में) के साथ ओवरलैप होना चाहिए।
क्या इस के संदर्भ में अर्थ है "क्या हुआ अगर मैं t.c
सेट करने के बाद t.i
पढ़ने की कोशिश मैं मिलता है" में असली दुनिया मंच endianness पर निर्भर करता है, और तथ्यों में एक यूनियन का सदस्य पढ़ने का प्रयास जब आप किसी अन्य में लिखा था सी मानक के अनुसार एक निर्दिष्ट व्यवहार है (§6.2.6.1.6/7, §J.1.1 पर बहाल)।
union
{
int i;
unsigned char ch[sizeof(i)];
} t;
कर
t.i=20;
:
और क्या मदद करता है (कम से कम, मुझे लगता है कि यह समझना महत्वपूर्ण है और अधिक सरल है) मशीन के endianness को समझने के लिए इस तरह एक संघ है
और उसके बाद t.ch
पर दो वर्णों के अंदर क्या दिख रहा है। यदि आप छोटी-छोटी मशीन पर हैं तो आपको t.ch[0]==20
और t.ch[1]==0
मिलेगा, और इसके विपरीत यदि आप एक बड़ी-एंडियन मशीन पर हैं (यदि sizeof(int)==2
)। ध्यान दें कि, जैसा कि पहले से ही कहा गया है, यह एक कार्यान्वयन विशिष्ट विवरण है, मानक में अंतहीनता का भी उल्लेख नहीं है।
इसे और भी स्पष्ट करने के लिए: यदि आपके पास 2-बाइट int
var-minian मशीन पर 20 से सेट है, तो पता-क्रम में उससे जुड़ी मेमोरी डंप कर, आपको मिलेगा (हेक्साडेसिमल प्रतिनिधित्व में, अंतरिक्ष के आधार पर विभाजित बाइट्स):
14 00
जबकि एक बड़े endian मशीन पर आप
00 14
बड़े endian प्रतिनिधित्व देखने के हमारे बिंदु से "अधिक सही" लग रहा है, क्योंकि में मिल जाएगा छोटे एंडियन प्रतिनिधित्व बाइट्स जो पूरेबनाते हैंरिवर्स ऑर्डर में संग्रहीत हैं।
इसके अलावा मैं कह रहा हूँ कि अगर मैं इस कार्य करें:
int a=20;
printf("%d",* (char*)&a);
फिर उत्पादन endian सत्ता पर निर्भर नहीं करता है कि क्या यानी 20 2000 या 2001 में संग्रहीत किया जाता है ?
हाँ, यह ऐसा करता है, लेकिन आपके प्रश्न में आप एक और बात पूछ रहे हैं; यह मेरा उदाहरण दिखता है।
मुझे यकीन नहीं है कि क्या यूनियन-नेस के पास कुछ भी है जहां यूनियन संग्रहीत किया जाता है ... सभी यूनियन प्रकार एक ही स्थान पर स्टोर नहीं करते हैं (यानी, शून्य ऑफसेट पर)? (हालांकि अच्छा सवाल!) –
2001 असंभव है, क्योंकि अनियंत्रित स्मृति पहुंच आर्किटेक्चर के आधार पर या तो धीमी या वर्जित है। –
@ प्लैटिनम अज़ूर: अगर हम केवल int = 20 को परिभाषित करते हैं; तो क्या यह अंतहीनता पर निर्भर नहीं है जहां 20 संग्रहीत है? –