2012-08-16 18 views
11

अगर मैं निम्नलिखित कोड है:क्या कोई सूचक एलएसबी या एमएसबी को इंगित करता है?

int i = 5; 
void * ptr = &i; 
printf("%p", ptr); 

मैं LSB मैं उसका पता प्राप्त होगा, या MSB?
क्या यह प्लेटफार्मों के बीच अलग-अलग कार्य करेगा?
क्या सी और सी ++ के बीच कोई अंतर है?

+5

यह ** अपरिभाषित व्यवहार है ** के लिए एक ही हो जाएगा। 'Ptr' मुद्रित करने का एकमात्र तरीका'% p' के साथ है, या इसे 'intptr_t' में परिवर्तित करके और प्रिंट स्वरूपण मैक्रो के अनुसार। –

+1

क्या यह अंतहीनता के बारे में नहीं है? –

उत्तर

15

पर विचार करें int का आकार 4 बाइट है। हमेशा &i आपको उन 4 बाइट्स का पहला पता देगा।

यदि आर्किटेक्चर थोड़ा एंडियन है, तो निचले पते में एलएसबी नीचे जैसा होगा।

 
     +------+------+------+------+ 
Address | 1000 | 1001 | 1002 | 1003 | 
     +------+------+------+------+ 
Value | 5 | 0 | 0 | 0 | 
     +------+------+------+------+ 

वास्तुकला बड़ा endian है, तो कम पता MSB नीचे की तरह होगा। अगर थोड़ा endian या यह MSB i का पता दे देंगे अगर बड़ा endian

मिश्रित endian मोड में भी, या तो कम या बड़ा endian प्रत्येक कार्य के लिए चुना जाएगा

 
     +------+------+------+------+ 
Address | 1000 | 1001 | 1002 | 1003 | 
     +------+------+------+------+ 
Value | 0 | 0 | 0 | 5 | 
     +------+------+------+------+ 

तो &ii का पता दे देंगे LSB गतिशील।

नीचे तर्क हो जाएगा ताकि आप endianess बताता

int i = 5; 
void * ptr = &i; 
char * ch = (char *) ptr; 

printf("%p", ptr); 
if (5 == (*ch)) 
    printf("\nlittle endian\n"); 
else 
    printf("\nbig endian\n"); 

यह व्यवहार c और c++ दोनों

8

क्या मुझे एल, या एमएसबी का एलएसबी पता मिलेगा?

इस मंच निर्भर है: यह हो जाएगा न्यूनतम बाइट, जो MSB हो सकता है या LSB अपने प्लेटफ़ॉर्म के endianness के आधार पर संबोधित किया।

जब एक वस्तु के लिए सूचक एक चरित्र प्रकार के लिए सूचक में बदल जाती है, परिणाम:

हालांकि इस मानक सीधे में नहीं लिखा है, यह क्या खंड 6.3.2.3.7 से गर्भित है ऑब्जेक्ट के सबसे निचले बाइट को इंगित करता है।


यह प्लेटफार्मों के बीच अलग तरह से कार्य करेंगे?

हाँ


वहाँ एक अंतर यहाँ सी और सी के बीच है ++?

नहीं: यह मंच पर निर्भर दोनों सी में और सी ++

+0

हालांकि मुझे लगभग निश्चित है कि यह सही है - क्या आप इन दावों के लिए संदर्भ प्रदान कर सकते हैं? – amit

+0

@amit मुझे प्रत्यक्ष पुष्टि नहीं मिली, लेकिन मानक उस अनुभाग में "सबसे कम संबोधित बाइट" कहता है जहां यह 'char' सूचक में रूपांतरण के बारे में बात करता है। – dasblinkenlight

+0

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

5

ptr है पूर्णांक वस्तु का प्रारंभिक बाइट का पता संग्रहीत करता है। चाहे वह सबसे अधिक या कम से कम महत्वपूर्ण बाइट संग्रहीत है, आपके प्लेटफॉर्म पर निर्भर करता है। कुछ अजीब प्लेटफार्म भी मिश्रित अंतहीनता का उपयोग करते हैं, इस मामले में यह न तो एमएसबी और न ही एलएसबी होगा।

उस संबंध में सी और सी ++ के बीच कोई अंतर नहीं है।

8

यह मंच की समाप्ति पर निर्भर करता है; यदि यह एक छोटा-अंत मंच है, तो आपको एलएसबी के लिए एक सूचक मिलेगा, अगर यह एक बड़ा एंडियन मंच है तो यह एमएसबी को इंगित करेगा। यहां तक ​​कि कुछ मिश्रित-एंडियन प्लैफॉर्म भी हैं, उस मामले में भगवान को आपकी आत्मा की दया हो सकती है अपने कंपाइलर/सीपीयू के विशिष्ट दस्तावेज की जांच करें। वैसे संकेत मुद्रित करने के लिए आप %p प्लेसहोल्डर, नहीं %d का उपयोग करना चाहिए

uint32_t i=0x01020304; 
char le[4]={4, 3, 2, 1}; 
char be[4]={1, 2, 3, 4}; 
if(memcmp(&i, le, 4)==0) 
    puts("Little endian"); 
else if(memcmp(&i, be, 4)==0) 
    puts("Big endian"); 
else 
    puts("Mixed endian"); 

,:

फिर भी, आप एक त्वरित जांच कार्यावधि में प्रदर्शन कर सकते हैं।

+0

कृपया मेरे छोटे संदेह को स्पष्ट करें। मेरे ज्ञान के अनुसार मिश्रित एंडियन सिस्टम प्रत्येक कार्य के लिए या तो छोटे या बड़े एंडियन का चयन करेगा। कृपया मुझे बताएं कि आपके पोर्ग्राम में अन्य मामले का क्या उपयोग है। क्या मिश्रित एंडियन के बारे में मेरी समझ गलत है? – rashok

+0

"मिश्रित एंडियन" आर्किटेक्चर के लिए उपयोग किया जाने वाला एक कैचॉल शब्द है जहां बाइट ऑर्डरिंग कैननिकल बिग-एंडियन या छोटे-एंडियन नहीं है (कुछ उदाहरणों के लिए विकिपीडिया देखें); मेरा कोड बस जांचता है कि 32-बिट पूर्णांक की स्मृति प्रस्तुति बड़े-एंडियन या छोटे-एंडियन सिस्टम के लिए अपेक्षित से मेल खाती है, यदि यह मेल नहीं खाती है तो यह आगे की जांच नहीं करती है और केवल यह कहती है कि यह मिश्रित एंडियन है। –

3

यह मेरे वीसी ++ 2010 और डिजिटल मंगल के लिए एमएसबी क्या है। लेकिन यह अंतहीनता से संबंधित है।

इस प्रश्न के उत्तर आपके लिए कुछ जानकारी देते हैं: Detecting endianness programmatically in a C++ program

यहाँ, उपयोगकर्ता "कोई नहीं" का कहना है:

#define BIG_ENDIAN  0 
#define LITTLE_ENDIAN 1 
int TestByteOrder() 
{ 
    short int word = 0x0001; 
    char *byte = (char *) &word; 
    return(byte[0] ? LITTLE_ENDIAN : BIG_ENDIAN); 
} 

यह कुछ endianness जानकारी

1

अच्छी तरह से मैं LSB मैं का पता मिलता है, या MSB देता है?

यह मशीन और ओएस पर निर्भर करता है। बड़ी एंडियन मशीनों और ओएस पर आपको एमएसबी मिलेगा और छोटी एंडियन मशीनों और ओएस पर आपको एलएसबी मिलेगा।

विंडोज हमेशा छोटा एंडियन होता है। X86 पर लिनक्स/यूनिक्स के सभी (सबसे?) स्वाद छोटे एंडियन हैं। मोटोरोला मशीनों पर लिनक्स/यूनिक्स बड़ा एंडियन है। X86 मशीनों पर मैक ओएस थोड़ा एंडियन है। पावरपीसी मशीनों पर यह बड़ा एंडियन है।

अच्छी तरह से यह प्लेटफार्मों के बीच अलग-अलग कार्य करता है? हां यह होगा।

सी और सी ++ के बीच यहां कोई अंतर है? शायद नहीं।