2012-09-08 23 views
10
#include <stdio.h> 

int main(){ 
    unsigned char a[4] = {1, 2, 3, 4}; 
    int b = *(int *)&a[0]; 

    printf("%d\n", b); 
    return 0; 
} 

मैं बस नहीं समझ सकता क्यों b का परिणाम 0x4030201 है।डाली चार सरणी पूर्णांक

क्या कोई मेरी मदद कर सकता है?

+3

'बी'' 0x4030201' नहीं है, क्या आपका मतलब है 'int b = * (int *) &a[0]; '? –

+1

हां, मैंने गलत टाइप किया है। धन्यवाद। मैंने इसे – Learner

+0

बदल दिया है जो आपने लिखा है वह अनिर्धारित व्यवहार है। इसे सही करने के लिए, आपको कहना चाहिए: 'int b; unsigned char * a = (unsigned char *) & b; '(और अपनी लाइन को हटा दें जो 'बी' घोषित करता है।) –

उत्तर

1

क्योंकि आपका सिस्टम थोड़ा प्यारा है। बहु-बाइट पूर्णांक में पहला बाइट थोड़ा एंडियन सिस्टम में कम से कम महत्वपूर्ण बाइट के रूप में व्याख्या किया जाता है।

5

आप छोटी-छोटी मशीन पर हैं, इसका मतलब यह है कि बाइट स्टोर से बड़े आकार वाले पूर्णांक पहले कम से कम महत्वपूर्ण बाइट स्टोर करते हैं।

ध्यान दें कि इन दिनों अधिकांश आर्किटेक्चर x86 की सामान्य-नस्ल के लिए बहुत ही कम धन्यवाद हैं।

+0

तो अगर मैं एक बड़ी-एंडियन मशीन का उपयोग कर रहा था, तो परिणाम 0x1020304 होगा? – Learner

+1

@ उपयोगकर्ता1592172 हां। –

+1

लिटिल-एंडियन मशीनें कम से कम महत्वपूर्ण * बाइट्स * स्टोर करती हैं, बिट्स नहीं, पहले। क्या यह एक टाइपो है? –

13

जब आप इस तरह एक सरणी बनाने के लिए संकलक बता:

unsigned char a[4] = {1, 2, 3, 4}; 

ये संख्या निम्न क्रम में स्मृति में कहीं रखा जाता है:

MemoryAddress0: 0x01 -> a[0] 
MemoryAddress1: 0x02 -> a[1] 
MemoryAddress2: 0x03 -> a[2] 
MemoryAddress3: 0x04 -> a[3] 

&a[0] के मूल्य के साथ एक char सूचक है MemoryAddress0 और 0x01

(int*)&a[0] एक जाति है MemoryAddress0 के समान मान के साथ डी सूचक, लेकिन int* के साथ इस बार टाइप करें ताकि यह लगातार चार बाइट्स इंगित करे।

अधिकांश मशीनों हम अपने दैनिक जीवन में उपयोग थोड़ा endian जिसका मतलब है कि वे सबसे महत्वपूर्ण एक करने के लिए कम से कम महत्वपूर्ण बाइट से स्मृति में multibyte मान संग्रहीत कर रहे हैं।

जब int* चार बाइट्स की स्मृति के लिए इंगित करता है, तो पहला बाइट यह मुठभेड़ कम से कम महत्वपूर्ण बाइट है और दूसरा बाइट दूसरा सबसे महत्वपूर्ण और अन्य है।

MemoryAddress0: 0x01 -> 2^0 term 
MemoryAddress1: 0x02 -> 2^8 term 
MemoryAddress2: 0x03 -> 2^16 term 
MemoryAddress3: 0x04 -> 2^24 term 

इस प्रकार 4 बाइट पूर्णांक मान 0x01*2^0 + 0x02*2^8 + 0x03*2^16 + 0x04*2^24 जो 0x04030201 के बराबर है हो जाता है।

+0

आपके विस्तृत स्पष्टीकरण के लिए धन्यवाद ... – Learner

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