थोड़ा एंडियन प्रारूप का लाभ क्या है?


140

इंटेल प्रोसेसर (और शायद कुछ अन्य) भंडारण के लिए छोटे एंडियन प्रारूप का उपयोग करते हैं।

मुझे हमेशा आश्चर्य होता है कि कोई क्यों बाइट्स को रिवर्स ऑर्डर में स्टोर करना चाहता है। क्या इस प्रारूप का बड़े एंडियन प्रारूप पर कोई लाभ है?


1
6502 एक प्रारंभिक (पहला?) पाइपलाइन वाला प्रोसेसर था। मुझे लगता है कि पाइपलाइन के कारण कुछ प्रदर्शन-संबंधी मुद्दे के बारे में यह दावा किया जा सकता है कि यह थोड़ा-सा है। कोई सुझाव?
203


3
लिटिल-एंडियन, बिग-एंडियन - आपको एक या दूसरे को चुनना होगा। जैसे सड़क पर बाईं या दाईं ओर गाड़ी चलाना।

3
मेरा सुझाव है कि आप ASM में कुछ कोड लिखने के लिए, अधिमानतः एक "पुराने स्कूल" वास्तुकला जैसे कि 6502 या Z80 के लिए। आप तुरंत देखेंगे कि ये छोटे एंडियन का उपयोग क्यों करते हैं। आर्किटेक्चर जो बड़े एंडियन का उपयोग करते हैं, उनके निर्देश सेट में कुछ विशेषताएं होती हैं जो उस प्रारूप को इसके बजाय बेहतर बनाती हैं। यह एक मनमाना निर्णय नहीं है!
स्टीफन पॉल नैक

2
प्रत्येक बाइट-ऑर्डर प्रणाली के अपने फायदे हैं। लिटिल-एंडियन मशीनें आपको दूसरों को पढ़ने के बिना सबसे कम-बाइट पहले पढ़ने देती हैं। आप जांच सकते हैं कि कोई संख्या विषम है या सम (अंतिम बिट 0 है) बहुत आसानी से, जो कि उस तरह की चीज में होने पर शांत है। बिग-एंडियन सिस्टम डेटा को मेमोरी में उसी तरह स्टोर करते हैं जिस तरह से हम इंसान डेटा (लेफ्ट-टू-राइट) के बारे में सोचते हैं, जिससे लो-लेवल चार्जिंग आसान हो जाती है।
कोरे तुगे

जवाबों:


198

दोनों तरह से तर्क हैं, लेकिन एक बिंदु यह है कि थोड़ा-एंडियन सिस्टम में, स्मृति में दिए गए मान का पता, जिसे 32, 16 या 8 बिट चौड़ाई के रूप में लिया जाता है, एक ही है।

दूसरे शब्दों में, यदि आपके पास मेमोरी में दो बाइट का मूल्य है:

0x00f0   16
0x00f1    0

16-बिट मान के रूप में '16' (अधिकांश 32-बिट सिस्टम पर c) छोटा या 8-बिट मान के रूप में (आमतौर पर c 'char') केवल आपके द्वारा उपयोग किए जाने वाले भ्रूण के निर्देश में परिवर्तन करता है - आपके द्वारा प्राप्त किया गया पता नहीं से।

एक बड़े-एंडियन सिस्टम पर, जैसा कि ऊपर दिया गया है:

0x00f0    0
0x00f1   16

आपको पॉइंटर को बढ़ाना होगा और फिर नए मूल्य पर संकरा लाने के लिए ऑपरेशन करना होगा।

इसलिए, संक्षेप में, 'थोड़ा एंडियन सिस्टम पर, कास्ट एक नो-ऑप हैं।'


3
यह मानते हुए कि उच्च-क्रम वाले बाइट जो आपने नहीं पढ़े हैं, उन्हें यथोचित रूप से अनदेखा किया जा सकता है (जैसे कि आप जानते हैं कि वे महत्वपूर्ण रूप से काम कर रहे हैं)।
213 पर स्टीव 314

10
@ स्टीव ३१४: अगर मैं सी-डाउन में ३२ से १६ बिट्स (जैसे) पर हूं, तो २-सप्लीमेंट सिस्टम पर - सिस्टम के विशाल बहुमत - बाइट्स को नजरअंदाज करने की जरूरत नहीं है। उनके मूल्य के बावजूद मैं उन्हें अनदेखा कर सकता हूं और सी मानक और प्रोग्रामर की अपेक्षाओं के अनुरूप रह सकता हूं।

9
@Stritzinger - हम असेंबली द्वारा निर्मित असेंबली / मशीन कोड के बारे में बात कर रहे हैं, जो पोर्टेबल नहीं हो सकता। संकलन करने के लिए उच्च स्तरीय भाषा कोड पोर्टेबल है - यह बस विभिन्न आर्किटेक्चर पर अलग-अलग संचालन के लिए संकलित करता है (जैसा कि सभी ऑप्स करते हैं)।
जुलवाइज

7
मैं इस तर्क को नहीं खरीदता, क्योंकि बड़े-एंडियन आर्किटेक्चर पर, एक पॉइंटर अंत की ओर इशारा कर सकता है, बजाय शुरुआत के, जो कुछ भी यह है कि आप इसका उल्लेख कर रहे हैं और इससे आपको बिल्कुल वही फायदा होगा।
dan_waterworth

4
@dan_waterworth काफी नहीं - उदाहरण के लिए, C में पॉइंटर अंकगणितीय नियमों को ध्यान में रखें और जब आप एक ही पॉइंटर को बढ़ाते या घटाते हैं तो क्या होता है। आप जटिलता को स्थानांतरित कर सकते हैं, लेकिन आप इसे समाप्त नहीं कर सकते।
Jimwise

45

मुझे हमेशा आश्चर्य होता है कि कोई क्यों बाइट्स को रिवर्स ऑर्डर में स्टोर करना चाहता है।

बिग-एंडियन और लिटिल-एंडियन केवल "सामान्य आदेश" और "रिवर्स ऑर्डर" मानवीय दृष्टिकोण से हैं, और उसके बाद ही यदि ये सभी सत्य हैं ...

  1. आप स्क्रीन पर या कागज पर मूल्यों को पढ़ रहे हैं।
  2. आप बाईं ओर निचले मेमोरी पते, और दाईं ओर उच्चतर हैं।
  3. आप हेक्स में लिख रहे हैं, बाईं ओर उच्च-क्रम वाली नायब के साथ, बाईं ओर सबसे महत्वपूर्ण बिट के साथ।
  4. आप बाएं-दाएं पढ़ते हैं।

वे सभी मानव सम्मेलन हैं जो सीपीयू में बिल्कुल भी मायने नहीं रखते हैं। यदि आप # 1 और # 2, और फ्लिप # 3 को बनाए रखने के लिए थे, तो छोटे-एंडियन अरबी या हिब्रू पढ़ने वाले लोगों के लिए "पूरी तरह से प्राकृतिक" प्रतीत होंगे, जिन्हें राइट-टू-लेफ्ट लिखा जाता है।

और ऐसे अन्य मानव सम्मेलन हैं जो बड़े-बड़े हैं जो अप्राकृतिक लगते हैं, जैसे ...

  • "उच्च" (सबसे महत्वपूर्ण) बाइट "उच्च" मेमोरी पते पर होना चाहिए।

जब मैं ज्यादातर 68K और PowerPC प्रोग्रामिंग कर रहा था, मैंने बड़े-एंडियन को "सही" और छोटे-एंडियन को "गलत" माना। लेकिन जब से मैं और अधिक एआरएम और इंटेल काम कर रहा हूँ, मैं छोटे एंडियन के लिए इस्तेमाल किया है। यह वास्तव में कोई फर्क नहीं पड़ता।


30
संख्या वास्तव में अरबी और हिब्रू में [सबसे महत्वपूर्ण अंक] बाएं से कम से कम [महत्वपूर्ण अंक] सही लिखी जाती है।
रैंडम 832

5
तो फिर "बड़े एंडियन" प्रारूप में संग्रहीत बाइट के भीतर बिट्स क्यों हैं? सुसंगत क्यों नहीं?
tskuzzy

11
वे नहीं हैं - बिट ० सम्मेलन के द्वारा सबसे कम महत्वपूर्ण है, और बिट is सबसे महत्वपूर्ण है। इसके अलावा, आप आम तौर पर एक बाइट के भीतर बिट्स पर एक आदेश नहीं डाल सकते हैं, क्योंकि बिट्स व्यक्तिगत रूप से संबोधित करने योग्य नहीं हैं। बेशक, उनके पास किसी दिए गए संचार प्रोटोकॉल या भंडारण मीडिया में एक भौतिक आदेश हो सकता है, लेकिन जब तक आप निम्न-स्तर के प्रोटोकॉल या हार्डवेयर स्तर पर काम नहीं कर रहे हैं, तब तक आपको इस आदेश के साथ खुद को चिंता करने की आवश्यकता नहीं है।
स्टीवर्ट

3
ब्लूराजा: केवल कागज पर लिखने के सम्मेलन द्वारा। यह सीपीयू वास्तुकला के साथ आम में कुछ भी नहीं है। आप 7-0 MSB-LSB के बजाय 4-7 एलएसबी-एमएसबी के रूप में बाइट लिख सकते हैं और एल्गोरिथ्म दृष्टिकोण से कुछ भी नहीं बदलता है।
एसएफ।

2
@ एसएफ .: "शॉर्ट शॉर्ट, पॉप कुछ भी लेकिन शॉर्ट " आपको वैसे भी आश्चर्यचकित कर देगा। यहां तक ​​कि अगर आप बाइट्स को धक्का देकर स्टैक को भ्रष्ट नहीं कर रहे हैं तो आप कभी भी पॉप या इसके विपरीत नहीं ... x86 (32-बिट), उदाहरण के लिए, वास्तव में वास्तव में स्टैक को डॉर्ड-एलाइन होना चाहिए, और किसी भी चीज को धक्का देना या पॉपिंग करना जो इसका कारण बनता है स्टैक पॉइंटर 4 के एक से अधिक नहीं होने के कारण संरेखण मुद्दे हो सकते हैं। और यहां तक ​​कि अगर यह नहीं था, सामान एक बार में एक पूरे शब्द / डॉर्ड / qword / etc को धकेल दिया है - इसलिए कम बाइट अभी भी पहली बार होगी जब आप पॉप करते हैं।
cHao

41

ठीक है, यहाँ कारण है जैसा कि मैंने इसे बताया है: मुझे जोड़ और घटाव

जब आप मल्टी-बाइट संख्या जोड़ते हैं या घटाते हैं, तो आपको कम से कम महत्वपूर्ण बाइट के साथ शुरू करना होगा। यदि आप उदाहरण के लिए दो 16-बिट संख्या जोड़ रहे हैं, तो कम से कम महत्वपूर्ण बाइट से लेकर सबसे महत्वपूर्ण बाइट तक एक कैरी हो सकती है, इसलिए आपको यह देखना होगा कि कैरी है या नहीं। यह वही कारण है कि आप लॉन्गहैंड जोड़ते समय सबसे सही अंक से शुरू करते हैं। आप बाईं ओर से शुरू नहीं कर सकते।

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

यह पुराने 8-बिट सिस्टम पर है। एक आधुनिक सीपीयू पर मुझे संदेह है कि बाइट ऑर्डर से कोई फर्क पड़ता है और हम केवल ऐतिहासिक कारणों के लिए थोड़ा एंडियन का उपयोग करते हैं।


3
आह - तो यह लगभग एक ही कारण है कि मैं बड़े पूर्णांकों के लिए छोटे-एंडियन चंक ऑर्डर का उपयोग करता हूं। मुझे वह काम करना चाहिए था। लोगों को वास्तव में अब साइबरनेटिक्स पर काम करने की आवश्यकता है - मेरे दिमाग में पहले से ही कुछ प्रतिस्थापन भागों और कुछ कट्टरपंथी उन्नयन की सख्त जरूरत है, मैं हमेशा इंतजार नहीं कर सकता!
203

2
एक विचार - 6502 ने हार्डवेयर में बहुत अधिक 16-बिट गणित नहीं किया - यह, आखिरकार, 8 बिट प्रोसेसर था। लेकिन इसने १६-बिट आधार पते के सापेक्ष did-बिट हस्ताक्षरित ऑफ़सेट्स का उपयोग करते हुए रिश्तेदार संबोधन किया
स्टीव 314

2
ध्यान दें कि यह विचार अभी भी कई सटीक पूर्णांक अंकगणित (स्टीव 314 द्वारा कहा गया) के लिए मायने रखता है, लेकिन शब्द स्तर पर। अब, अधिकांश संचालन सीधे प्रोसेसर की समाप्ति से प्रभावित नहीं होते हैं: एक अभी भी एक बड़े-एंडियन सिस्टम पर सबसे कम महत्वपूर्ण शब्द को स्टोर कर सकता है, जैसा कि GMP द्वारा किया गया है। लिटिल-एंडियन प्रोसेसर के पास अभी भी कुछ ऑपरेशन (जैसे कुछ स्ट्रिंग रूपांतरण?) के लिए एक फायदा है जो एक बार में एक बाइट को पढ़कर आसान हो सकता है, क्योंकि केवल एक छोटे से एंडियन सिस्टम पर, ऐसे नंबरों का बाइट ऑर्डर सही है।
vinc17

मेमोरी बैंडविड्थ सीमित होने की स्थिति में छोटे एंडियन प्रोसेसर का फायदा होता है, जैसे कुछ 32-बिट एआरएम प्रोसेसर में 16-बिट मेमोरी बस के साथ, या 8-बिट डेटा बस के साथ 8088: प्रोसेसर सिर्फ कम आधा लोड कर सकता है और कर सकता है add / sub / mul ... इसके साथ ही उच्चतर अर्धशतक का इंतज़ार करते हुए
phuclv

13

8 बिट प्रोसेसर के साथ यह निश्चित रूप से अधिक प्रभावोत्पादक था, आप विभिन्न कोड की आवश्यकता के बिना और अतिरिक्त मानों को बफर करने की आवश्यकता के बिना एक 8 या 16 बिट ऑपरेशन कर सकते हैं।

यदि आप एक बार में एक बाइट का काम कर रहे हैं तो यह कुछ अतिरिक्त संचालन के लिए अभी भी बेहतर है।

लेकिन कोई कारण नहीं है कि बड़ा-एंडियन अधिक स्वाभाविक है - अंग्रेजी में आप तेरह (छोटे एंडियन) और तेईस (बड़ा एंडियन) का उपयोग करते हैं


1
बिग-एंडियन वास्तव में मनुष्यों के लिए आसान है क्योंकि इसे बाइट्स को फिर से व्यवस्थित करने की आवश्यकता नहीं है। उदाहरण के लिए, एक पीसी पर, 0x12345678स्टोर किया जाता है 78 56 34 12जबकि एक बीई सिस्टम पर यह 12 34 56 78(बाइट 0 बाईं तरफ है, बाइट 3 दाईं ओर है)। ध्यान दें कि संख्या कितनी बड़ी है (बिट्स के संदर्भ में), इसके लिए अधिक स्वैपिंग की आवश्यकता होती है; WORD को एक स्वैप की आवश्यकता होगी; एक DWORD, दो पास (तीन कुल स्वैप); एक QWORD तीन पास (7 कुल), और इसी तरह। यही है, (bits/8)-1स्वैप। एक अन्य विकल्प उन दोनों को आगे और पीछे की तरफ पढ़ रहा है (प्रत्येक बाइट को आगे की तरफ पढ़ रहा है, लेकिन पूरे # पीछे की तरफ स्कैन करता है)।
सिनेटेक

एक सौ-और-तेरह या तो मध्य-अंतियन है, या फिर "तेरह" के साथ बड़ा-एंडियन अनिवार्य रूप से एक गैर-दशमलव अंक है। जब हम संख्या उल्लेख, वहाँ निरंतर आधार सम्मेलनों है कि हम अंक के लिए उपयोग से कुछ मामूली विचलन कर रहे हैं, लेकिन एक बार आप उन विशेष मामलों को निकाल देते हैं बाकी बड़े endian है - लाखों से पहले हजारों, हजारों से पहले सैकड़ों आदि
Steve314

@ Synetech- सौभाग्य से कंप्यूटर को इस बात की परवाह नहीं है कि मनुष्य उन्हें कैसे पढ़ता है। यह दावा करने जैसा है कि नंद फ्लैश बेहतर है क्योंकि ओ.टी. '
मार्टिन बेकेट

1
@ Steve314, संख्याओं के वर्तनी-संबंधी शब्द कोई मायने नहीं रखते, यह संख्यात्मक रीडआउट है जो हम प्रोग्राम करते समय उपयोग करते हैं। मार्टिन, किसी भी कंप्यूटर को परवाह नहीं है कि मनुष्य संख्याओं को कैसे पढ़ता है, लेकिन अगर मनुष्यों के लिए उन्हें पढ़ना आसान है, तो प्रोग्रामिंग (या अन्य संबंधित कार्य) आसान हो जाते हैं और कुछ खामियां और कीड़े कम हो सकते हैं या बच सकते हैं।
सिंटेक

@ steve314 और डेनिश में, "95" का उच्चारण "महिला हफ़्फ़" (पांच, प्लस साढ़े चार बिसवां दशा) है।
वेटिन

7

जापानी तिथि सम्मेलन "बड़ा एंडियन" है - yyyy / mm / dd। यह एल्गोरिदम को छांटने के लिए आसान है, जो सामान्य प्रथम-चरित्र-सबसे-महत्वपूर्ण नियम के साथ एक साधारण स्ट्रिंग-तुलना का उपयोग कर सकता है।

सबसे महत्वपूर्ण-फ़ील्ड-प्रथम रिकॉर्ड में संग्रहीत बड़े-एंडियन संख्याओं के लिए कुछ समान लागू होता है। फ़ील्ड्स के भीतर बाइट्स का महत्व क्रम रिकॉर्ड के भीतर फ़ील्ड्स के महत्व से मेल खाता है, इसलिए आप memcmpरिकॉर्ड्स की तुलना करने के लिए उपयोग कर सकते हैं , न कि आप दो लॉन्गवर्ड, चार शब्दों या आठ अलग-अलग बाइट्स की तुलना कर रहे हैं।

खेतों के महत्व के क्रम को पलटें और आपको उतना ही फायदा मिले, लेकिन बड़े-एंडियन की बजाय छोटे-छोटे संख्याओं के लिए।

इसका बहुत कम व्यावहारिक महत्व है। चाहे आपका प्लेटफ़ॉर्म बड़ा-एंडियन हो या छोटा-सा एंडियन, आप इस ट्रिक का फायदा उठाने के लिए रिकॉर्ड फ़ील्ड ऑर्डर कर सकते हैं यदि आपको वास्तव में ज़रूरत है। यह सिर्फ एक दर्द है अगर आपको पोर्टेबल कोड लिखने की आवश्यकता है ।

मैं भी क्लासिक अपील के लिए एक लिंक शामिल हो सकता है ...

http://tools.ietf.org/rfcmarkup?url=ftp://ftp.rfc-editor.org/in-notes/ien/ien137.txt

संपादित करें

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

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

  2. मूल्य बढ़ने या सिकुड़ने का अर्थ है अंत में विखंडू को जोड़ना / हटाना - चंक्स को ऊपर / नीचे शिफ्ट करने की कोई आवश्यकता नहीं है। मेमोरी रियलाइजेशन के कारण अभी भी नकल की आवश्यकता हो सकती है, लेकिन अक्सर नहीं।

यह प्रोसेसर के लिए कोई स्पष्ट प्रासंगिकता नहीं है, निश्चित रूप से - जब तक सीपीयू को हार्डवेयर बड़े-पूर्णांक समर्थन के साथ नहीं बनाया जाता है, यह विशुद्ध रूप से एक पुस्तकालय की चीज है।


7

किसी और ने जवाब नहीं दिया कि ऐसा क्यों किया जा सकता है, परिणामों के बारे में बहुत सारी चीजें।

एक 8 बिट प्रोसेसर पर विचार करें जो किसी दिए गए घड़ी चक्र में मेमोरी से एक सिंगल बाइट को लोड कर सकता है।

अब, यदि आप एक 16 बिट मान को लोड करना चाहते हैं, तो (कहें) आपके पास एक और केवल 16 बिट रजिस्टर है - अर्थात प्रोग्राम काउंटर, फिर इसे करने का एक सरल तरीका है:

  • भ्रूण स्थान से एक बाइट लोड करें
  • उस बाइट को बाएं 8 स्थानों पर शिफ्ट करें
  • वेतन वृद्धि स्मृति स्थान 1 से
  • अगला बाइट लोड करें (रजिस्टर के निचले क्रम में)

परिणाम: आप केवल कभी-कभी लाने के स्थान को बढ़ाते हैं, आप केवल व्यापक रजिस्टर के कम क्रम वाले हिस्से में लोड करते हैं, और आपको केवल बाईं ओर शिफ्ट होने में सक्षम होना चाहिए। (बेशक, सही स्थानांतरण अन्य कार्यों के लिए सहायक है, इसलिए यह एक साइड शो का एक सा है।)

इसका एक परिणाम यह है कि 16 बिट (डबल बाइट) सामान मोस्ट..लीस्ट में स्टोर किया जाता है। यानी, छोटे पते में सबसे महत्वपूर्ण बाइट है - इतना बड़ा एंडियन।

यदि आपने इसके बजाय छोटे एंडियन का उपयोग करके लोड करने की कोशिश की है, तो आपको अपने विस्तृत रजिस्टर के निचले हिस्से में एक बाइट को लोड करने की आवश्यकता है, फिर अगले बाइट को एक स्टेजिंग क्षेत्र में लोड करें, इसे शिफ्ट करें, और फिर इसे अपने व्यापक रजिस्टर के शीर्ष में पॉप करें। । या फिर गेटिंग की एक अधिक जटिल व्यवस्था का उपयोग करके ऊपर या नीचे की बाइट में चुनिंदा लोड करने में सक्षम होने के लिए।

थोड़ा एंडियन जाने की कोशिश करने का नतीजा यह है कि आपको अधिक सिलिकॉन (स्विच और गेट्स), या अधिक संचालन की आवश्यकता है।

दूसरे शब्दों में, पुराने दिनों में हिरन के लिए बैंग होने के मामले में, आपको सबसे अधिक प्रदर्शन और सबसे छोटे सिलिकॉन क्षेत्र के लिए अधिक बैंग मिला।

इन दिनों, इन विचारों और काफी अप्रासंगिक है, लेकिन पाइप लाइन को भरने तरह बातें कर सकते हैं अभी भी एक बड़ी बात का एक सा हो।

जब एस / डब्ल्यू लिखने की बात आती है, तो छोटे एंडियन संबोधन का उपयोग करते समय जीवन अक्सर आसान होता है।

(और बड़ा एंडियन प्रोसेसर बाइट ऑर्डर करने के मामले में बड़ा एंडियन होता है और बिट-बाय-बाइट के मामले में थोड़ा एंडियन होता है। लेकिन कुछ प्रोसेसर अजीब होते हैं और बड़े एंडियन बिट ऑर्डर के साथ-साथ बाइट ऑर्डर भी करते हैं। यह जीवन को बहुत अच्छा बनाता है। एच / डब्ल्यू डिजाइनर के लिए दिलचस्प है मेमोरी-मैप्ड बाह्य उपकरणों को जोड़ना लेकिन प्रोग्रामर के लिए कोई अन्य परिणाम नहीं है।)


3

jimwise ने एक अच्छी बात की। एक और मुद्दा है, थोड़ा एंडियन में आप निम्न कार्य कर सकते हैं:

byte data[4];
int num=0;
for(i=0;i<4;i++)
    num += data[i]<<i*8; 

OR 

num = *(int*)&data; //is interpreted as

mov dword data, num ;or something similar it has been some time

प्रोग्रामर के लिए अधिक सीधे फॉरवर्ड जो कि मेमोरी में स्वैप किए गए स्थानों के स्पष्ट नुकसान से प्रभावित नहीं हैं। मुझे व्यक्तिगत रूप से बड़ा एंडियन लगता है जो स्वाभाविक है का उलटा होना :)। 12 संग्रहीत और 21 के रूप में लिखा जाना चाहिए :)


1
यह सिर्फ यह साबित करता है कि सीपीयू के मूल में जो भी प्रारूप है, उसमें काम करना तेज / आसान है। यह बेहतर है या नहीं इसके बारे में कुछ भी नहीं कहता है। एक ही चीज बड़े एंडियन के लिए जाती है: एक बड़े एंडियन सीपीयू for(i=0; i<4; i++) { num += data[i] << (24 - i * 8); }से मेल खाती है move.l data, num
मार्टिन विलकंस

@ स्मार्टिन: मेरी किताब में एक कम घटाव बेहतर है
Cem Kalyoncu

यह वास्तव में कोई फर्क नहीं पड़ता क्योंकि संकलक वैसे भी लूप को अनियंत्रित करेगा। किसी भी मामले में, कई सीपीयू में इस समस्या को संभालने के लिए बाइट स्वैपिंग निर्देश हैं।
मार्टिन विलकंस

मैं बड़े एंडियन पर bcoz सहमत नहीं हूं, मैं {num << = 8; संख्या | = डेटा [i]; } कम से कम यह मुल का उपयोग करते हुए बाईं पारी की गणना करने की आवश्यकता नहीं है
हायरी यूउर कोल्टुक

@ali: आपका कोड मेरे द्वारा लिखे गए सटीक ऑपरेशन को करेगा और बड़े एंडियन पर काम नहीं करेगा।
केम कल्याणको

1

मुझे हमेशा आश्चर्य होता है कि कोई क्यों बाइट्स को रिवर्स ऑर्डर में स्टोर करना चाहेगा

दशमलव संख्या में बड़े एंडियन लिखे जाते हैं। यह भी है कि आप इसे अंग्रेजी में कैसे लिखते हैं आप सबसे महत्वपूर्ण अंक के साथ शुरू करते हैं और अगले सबसे महत्वपूर्ण से कम से कम सबसे महत्वपूर्ण। जैसे

1234

एक हजार, दो सौ चौंतीस है।

इस तरह से बड़े एंडियन को कभी-कभी प्राकृतिक क्रम कहा जाता है।

छोटे एंडियन में, यह संख्या एक, बीस, तीन सौ और चार हजार होगी।

हालांकि, जब आप अंकगणित जैसे जोड़ या घटाव करते हैं, तो आप अंत के साथ शुरू करते हैं।

  1234
+ 0567
  ====

आप 4 और 7 से शुरू करते हैं, सबसे कम अंक लिखते हैं और कैरी को याद करते हैं। फिर आप 3 और 6 आदि जोड़ते हैं। ऐड, घटाना या तुलना के लिए, इसे लागू करना सरल है, यदि आपके पास पहले से ही मेमोरी को क्रम में पढ़ने के लिए तर्क है, यदि संख्याएं उलट हैं।

इस तरह से बड़े एंडियन का समर्थन करने के लिए, आपको मेमोरी को रिवर्स में पढ़ने के लिए तर्क की आवश्यकता होती है, या आपके पास आरआईएससी प्रक्रिया है जो केवल रजिस्टरों पर काम करती है। ;)

Intel x86 / Amd x64 डिज़ाइन का बहुत कुछ ऐतिहासिक है।


0

बिग-एंडियन कुछ ऑपरेशनों के लिए उपयोगी है (दिमाग के बराबर ऑक्टेट-लंबाई स्प्रिंग्स के "bignums" की तुलना)। दूसरों के लिए लिटिल-एंडियन (दो "bignums" जोड़कर, संभवतः)। अंत में, यह इस बात पर निर्भर करता है कि सीपीयू हार्डवेयर को किसके लिए स्थापित किया गया है, यह आमतौर पर एक या दूसरे (कुछ एमआइपी चिप्स थे, IIRC, LE या BE होने के लिए बूट पर उपलब्ध है)।


0

जब परिवर्तनशील लंबाई के साथ केवल भंडारण और स्थानांतरण शामिल होते हैं, लेकिन कई मानों के साथ कोई अंकगणित नहीं होता है, तो LE को आमतौर पर लिखना आसान होता है, जबकि BE को पढ़ना आसान होता है।

आइए एक विशिष्ट उदाहरण के रूप में एक इंट-टू-स्ट्रिंग रूपांतरण (और पीछे) लें।

int val_int = 841;
char val_str[] = "841";

जब इंट को स्ट्रिंग में परिवर्तित किया जाता है, तो सबसे महत्वपूर्ण अंक की तुलना में कम से कम महत्वपूर्ण अंक निकालना आसान होता है। यह सब एक साधारण लूप में किया जा सकता है जिसमें एक साधारण अंतिम स्थिति होती है।

val_int = 841;
// Make sure that val_str is large enough.

i = 0;
do // Write at least one digit to care for val_int == 0
{
    // Constants, can be optimized by compiler.
    val_str[i] = '0' + val_int % 10;
    val_int /= 10;
    i++;
}
while (val_int != 0);

val_str[i] = '\0';
// val_str is now in LE "148"
// i is the length of the result without termination, can be used to reverse it

अब BE ऑर्डर में भी यही कोशिश करें। आमतौर पर आपको एक और विभाजक की आवश्यकता होती है जो विशिष्ट संख्या (यहां 100) के लिए 10 की सबसे बड़ी शक्ति रखता है। आपको पहले इसे खोजने की आवश्यकता है, निश्चित रूप से। और भी बहुत कुछ करना है।

बीई में ऐसा करना आसान है, जब इसे रिवर्स राइट ऑपरेशन के रूप में किया जाता है। स्टोर को सबसे महत्वपूर्ण अंक पिछले लिखें, इसलिए इसे पहले पढ़ा जाना चाहिए।

val_int = 0;
length = strlen(val_str);

for (i = 0; i < length; i++)
{
    // Again a simple constant that can be optimized.
    val_int = 10*val_int + (val_str[i] - '0');
}

अब ले क्रम में भी ऐसा ही करें। फिर, आपको 1 से शुरू होने वाले अतिरिक्त कारक की आवश्यकता होगी और प्रत्येक अंक के लिए 10 से गुणा किया जाएगा।

इस प्रकार मैं आमतौर पर बीई को स्टोरेज के लिए इस्तेमाल करना पसंद करता हूं, क्योंकि एक वैल्यू एक बार ही लिखी जाती है, लेकिन कम से कम एक बार और शायद कई बार पढ़ी जाती है। इसकी सरल संरचना के लिए, मैं आमतौर पर ले को बदलने और फिर परिणाम को रिवर्स करने के लिए मार्ग जाता हूं, भले ही वह दूसरी बार मूल्य लिखता हो।

BE भंडारण के लिए एक और उदाहरण UTF-8 एन्कोडिंग होगा, और कई और।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.