2010-02-11 12 views
8

आइए कहें कि मेरे पास 4 बिट पूर्णांक है और मैं इसे 2 बिट लघु पूर्णांक में डालना चाहता हूं। क्या मैं सही हूं कि दोनों (छोटे और बड़े एंडियन) छोटे पूर्णांक में इस 4 बिट पूर्णांक के 2 कम से कम महत्वपूर्ण बाइट होंगे?लिटिल एंडियन बनाम बिग एंडियन

दूसरा प्रश्न:
छोटे एंडियन और बड़े एंडियन प्रोसेसर में ऐसे कोड का नतीजा क्या होगा? बड़ा endian प्रोसेसर 2 सबसे महत्वपूर्ण बाइट में

int i = some_number; 
short s = *(short*)&i; 

IMHO कॉपी किया है, और थोड़ा endian में 2 कम से कम महत्वपूर्ण बाइट्स कॉपी किया जाएगा।

+0

मैं गणित का उपयोग प्रतिलिपि बनाने से पहले उचित श्रेणी (आकार) को कम करने के लिए करता हूं। कंपाइलर्स एंडियननेस बनाए रखेंगे ताकि आपको कई चिंताएं न हों। चर के हिस्सों की प्रतिलिपि बनाने के परिणामस्वरूप एंडियननेस चिंताओं के परिणामस्वरूप आप सामने आए हैं। –

उत्तर

12

क्या मैं सही हूं कि दोनों छोटे पूर्णांक में इस 4 बिट पूर्णांक के 2 कम से कम महत्वपूर्ण बाइट होंगे?

हां, परिभाषा के अनुसार।

बड़े और छोटे के बीच का अंतर यह है कि कम से कम महत्वपूर्ण बाइट निम्नतम पते पर है या नहीं। थोड़ा एंडियन प्रोसेसर पर, सबसे कम पते कम से कम महत्वपूर्ण बिट्स हैं, x86 इस तरह से करता है।

इन छोटी ई

short s = (short)i; 
short s = *(short*)&i; 

पर एक ही परिणाम दे एक बड़ा endian प्रोसेसर में, सर्वोच्च पतों कम से कम महत्वपूर्ण बिट, 68000 और पावर पीसी यह इस तरह से कर रहे हैं (वास्तव में पावर पीसी दोनों हो सकता है , एप्पल से लेकिन पीपीसी मशीनों का उपयोग bigE)

ये बड़े ई पर एक ही परिणाम दे

short s = (short)i; 
short s = ((short*)&i)[1]; // (assuming i is 4 byte int) 

तो, जैसा कि आप देख सकते हैं, थोड़ा endian आप एल ई ऐज़ पर प्राप्त करने के लिए अनुमति देता है एक ऑपरेंड के महत्वपूर्ण बिट्स को यह ज्ञात किए बिना कितना बड़ा है। पिछड़े ई को पिछड़े संगतता को संरक्षित करने के फायदे हैं।

तो बड़े एंडियन का क्या फायदा है? यह हेक्स डंप बनाता है जो पढ़ने में आसान है।

वास्तव में, मोटोरोला के इंजीनियरों ने सोचा कि हेक्स डंप पढ़ने का बोझ आसान पिछड़ा संगतता से अधिक महत्वपूर्ण था। इंटेल के इंजीनियरों ने विपरीत माना।

+0

मुझे यकीन नहीं है कि पिछड़ा संगतता तर्क बहुत मजबूत है, क्योंकि प्रोग्राम गलत तरीके से मानते हैं कि कुछ चर के पास एक विशिष्ट आकार होता है, अन्य कारणों से संभावित ब्रेक से अधिक होगा, यहां तक ​​कि थोड़ी एंडियन मशीन पर भी (जैसे सरणी से निपटने पर)। मुझे लगता है कि संकलक या हार्डवेयर के अंदर, कुछ निम्न स्तर के अनुकूलन और अन्य चालों को आसान बनाने के साथ इसे और अधिक करना है। –

+0

@ जोसेफ: हाँ, मुझे यकीन है कि हार्डवेयर डिजाइनरों द्वारा छोटे ई को क्यों पसंद किया गया था, इसके बहुत कम कारण थे, और संगतता उनके लिए महत्वपूर्ण नहीं हो सकती थी। लेकिन यह पता चला है कि 80886 से 286/386 तक जाने पर यह बहुत मायने रखता है। 8088 के लिए लिखा गया कोड अभी भी आधुनिक x86/x64 प्रोसेसर पर चलता है। –

+0

हां, x86 आर्किटेक्चर पिछली पीढ़ियों के पूरे निर्देश सेट को हमेशा बनाए रखते हुए, डिजाइन (अच्छे और बुरे के लिए) द्वारा द्विआधारी स्तर पर पीछे संगत होते हैं। माना जाता है कि यह विशेषज्ञता के मेरे क्षेत्र को सीमा से दूर करता है, लेकिन इस क्षेत्र में थोड़ा एंडियन मदद करता है, शायद मूवी निर्देशों के लिए सर्किट्री तर्क को सरल बनाने के अलावा? आपके पास अभी भी विभिन्न डेटा आकारों (बाइट, शब्द, दस्तावेज़ इत्यादि) के लिए अलग-अलग ऑपकोड हैं। –

2
  1. हां। जब आप मूल्यों को परिवर्तित करते हैं, तो आपको अंतहीनता के बारे में चिंता करने की ज़रूरत नहीं है।

  2. हां। जब आप पॉइंटर्स को कन्वर्ट करते हैं, तो आप करते हैं।

+0

और अनिवार्य रूप से केवल एक बार जब आपको पॉइंटर्स को इस तरह से परिवर्तित करने की आवश्यकता होती है, तो यह महत्वपूर्ण होता है, जब डेटा क्रमबद्ध होता है (यानी फ़ाइल या नेटवर्क I/O)। लेकिन उस स्थिति में, आपको वास्तव में चिंता करने की ज़रूरत है, क्योंकि पाठक एक अलग अंतराल का उपयोग कर सकता है। –

1

सबसे पहले, आप यह पहले से ही जानते हैं, लेकिन मुझे उल्लेख है कि पूर्णांक के आकार 4 बाइट्स और सभी प्लेटफार्मों भर में कम, 2 बाइट्स की है कि होने की गारंटी नहीं है दे सकते हैं।

आप कुछ इस तरह का मतलब अपने पहले प्रश्न में हैं:

int i = ...; 
short s = (short)i; 

तो हाँ, si के निचले बाइट (रों) शामिल होंगे।

मुझे लगता है कि आपके दूसरे प्रश्न का उत्तर भी हाँ है; बाइट स्तर पर सिस्टम की अंतहीनता खेल में आती है।

1

आप जानते हैं कि अपने दूसरे उदाहरण

int i = some_number; 
short s = *(short*)&i; 

वैध सी कोड के रूप में यह सख्त अलियासिंग के नियमों का उल्लंघन नहीं है होना चाहिए। यह कुछ अनुकूलन स्तरों और/या कंपाइलरों के तहत असफल होने की संभावना है।

कि के लिए

उपयोग यूनियनों:

union { 
    int i; 
    short s; 
} my_union; 

my_union.i = some_number; 
printf("%d\n",my_union.s); 

इसके अलावा, के रूप में दूसरों का उल्लेख किया है, तो आप कल्पना नहीं कर सकते कि आपके ints 4 बाइट किया जाएगा। जब आपको विशिष्ट आकार की आवश्यकता होती है तो int32_t और int16_t का बेहतर उपयोग करें।

+0

से बेहतर नहीं था तो यह अस्तित्व में नहीं होगा, यह सख्त एलियासिंग का उल्लंघन कैसे करता है? –

+1

एक संघ के सदस्य को लिखना और दूसरे से पढ़ना यूबी है। – dalle

+0

यह एक अलियासिंग उल्लंघन नहीं है। यह सिर्फ प्रकार प्रणाली को कम करता है, यह वास्तव में एक सूचक बनाता है। –

1

तुम सच में एक छोटी करने के लिए एक पूर्णांक कन्वर्ट करने के लिए चाहते हैं, तो बस यही काम:

short int_to_short(int n) { 
    if (n < SHRT_MIN) return SHRT_MIN; 
    if (n > SHRT_MAX) return SHRT_MAX; 
    return (short)n; 
} 

तुम भी के बारे में endian चिंता करने की ज़रूरत नहीं है, भाषा है कि संभालती है आप के लिए। यदि आप सुनिश्चित हैं कि n संक्षिप्त की सीमा के भीतर है, तो आप चेक को भी छोड़ सकते हैं।

+0

मुझे चिंता नहीं है, मैं सिर्फ उत्सुक था कि नतीजा क्या होगा। –

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