সামান্য এন্ডিয়ান ফর্ম্যাটটির সুবিধা কী?


140

ইন্টেল প্রসেসর (এবং সম্ভবত কিছু অন্য) স্টোরেজের জন্য সামান্য এন্ডিয়ান ফর্ম্যাট ব্যবহার করে।

আমি সর্বদা আশ্চর্য হই যে কেন কেউ বাইটগুলি বিপরীত ক্রমে সঞ্চয় করতে চায়। বড় এন্ডিয়ান ফর্ম্যাটটির চেয়ে এই ফর্ম্যাটটির কোনও সুবিধা আছে কি?


1
6502 ছিল একটি প্রাথমিক (প্রথম?) পাইপলাইনযুক্ত প্রসেসর। পাইপলাইনের কারণে কিছু পারফরম্যান্স-সম্পর্কিত ইস্যুটির জন্য এটি স্বল্প-এন্ডিয়ান হিসাবে থাকা কিছু দাবি আমার মনে আছে - তবে এই সমস্যাটি কী হতে পারে তা এখন আমার কোনও ধারণা নেই। কোনও পরামর্শ?
স্টিভ 314

1
@ স্টিভ ৩১৪: আমার উত্তরটি ব্যাখ্যা করেছে যে কীভাবে ছোট এন্ডিয়ান একটি পাইপলাইন করা সিপিইউতে পারফরম্যান্সে সহায়তা করে: প্রোগ্রামার্স.স্ট্যাকেক্সেঞ্জাও
ক / 95854/27874

3
লিটল-এন্ডিয়ান, বিগ-এন্ডিয়ান - আপনাকে অবশ্যই একটি বা অন্যটি বেছে নিতে হবে। রাস্তার বাম বা ডানদিকে গাড়ি চালানোর মতো।

3
আমি আপনাকে এএসএম-তে কিছু কোড লেখার পরামর্শ দিই, সম্ভবত "পুরাতন-স্কুল" আর্কিটেকচার যেমন 6502 বা জেড 80 এর জন্য। আপনি অবিলম্বে দেখতে পাবেন যে এগুলি কেন সামান্য এডিয়ান ব্যবহার করে। বড় এন্ডিয়ান ব্যবহার করে এমন আর্কিটেকচারগুলির তাদের নির্দেশাবলীর নির্দিষ্ট সেটগুলির নির্দিষ্ট বৈশিষ্ট্য রয়েছে যা পরিবর্তে সেই বিন্যাসটিকে পছন্দনীয় করে তোলে। সিদ্ধান্ত নেওয়ার বিষয়টি কোনও স্বেচ্ছাচারিতা নয়!
স্টিফান পল নোক

2
প্রতিটি বাইট-অর্ডার সিস্টেমের এর সুবিধা রয়েছে। লিটল-এন্ডিয়ান মেশিনগুলি আপনাকে অন্যগুলি না পড়ে প্রথমে সর্বনিম্ন-বাইট পড়তে দেয়। একটি সংখ্যা বিজোড় বা এমনকি (শেষ বিট 0 টি) খুব সহজেই আপনি যাচাই করতে পারেন, আপনি যদি এ জাতীয় জিনিসটিতে থাকেন তবে দুর্দান্ত। বিগ-এন্ডিয়ান সিস্টেমগুলি একইভাবে ডেটা মেমরিতে স্টোর করে আমরা মানুষেরা যেভাবে ডেটা (বাম থেকে ডান) নিয়ে ভাবি, যা নিম্ন-স্তরের ডিবাগিংকে সহজ করে তোলে।
Koray Tugay

উত্তর:


198

উভয় উপায়েই যুক্তি রয়েছে, তবে একটি বিষয় হ'ল সামান্য-এন্ডিয়ান সিস্টেমে, 32, 16 বা 8 বিট প্রস্থ হিসাবে নেওয়া মেমরির প্রদত্ত মানের ঠিকানাটি একই।

অন্য কথায়, আপনার যদি স্মৃতিতে দুটি বাইট মান থাকে:

0x00f0   16
0x00f1    0

সেই '16' কে 16-বিট মান হিসাবে (বেশিরভাগ 32-বিট সিস্টেমে 'সি' সংক্ষিপ্ত ') বা 8-বিট মান হিসাবে (সাধারণত সি' চর ') গ্রহণ করা কেবলমাত্র আপনার ব্যবহারের আনুষ্ঠানিক নির্দেশকে বদলে দেয় - আপনি যে ঠিকানাটি নিয়েছেন তা নয় থেকে।

একটি বিগ-এন্ডিয়ান সিস্টেমে, উপরোক্তগুলি এইভাবে প্রকাশিত হয়েছে:

0x00f0    0
0x00f1   16

আপনাকে পয়েন্টারটি বৃদ্ধি করতে হবে এবং তারপরে নতুন মানটিতে সংকীর্ণ আনতে হবে operation

সুতরাং, সংক্ষেপে, 'লিটল এন্ডিয়ান সিস্টেমে, ক্যাসেটগুলি কোনও অপ-বিকল্প নয়।'


3
অবশ্যই ধরে নেওয়া, আপনি যে উচ্চ-অর্ডার বাইটগুলি পড়েছেন তা যথাযথভাবে উপেক্ষা করা যেতে পারে (উদাহরণস্বরূপ আপনি জানেন যে সে যাইহোক শূন্য)।
স্টিভ 314

10
@ স্টিভ 314: যদি আমি 2-এর পরিপূরক সিস্টেমে 32 থেকে 16 বিট (উদাঃ) থেকে ডাউন কাস্টিংটিতে থাকি - সিস্টেমের বিশাল সংখ্যাগরিষ্ঠ - বাইটগুলি উপেক্ষা করার জন্য শূন্য হওয়ার দরকার নেই। তাদের মান নির্বিশেষে আমি সেগুলি উপেক্ষা করে সি স্ট্যান্ডার্ড এবং প্রোগ্রামার প্রত্যাশাগুলির সাথে সম্মতি রাখতে পারি।

9
@ স্ট্রিটজিঞ্জার - আমরা একটি সংকলক দ্বারা উত্পাদিত সমাবেশ / মেশিন কোড সম্পর্কে কথা বলছি, যা পোর্টেবল হতে পারে না। সংকলনের জন্য উচ্চ স্তরের ভাষার কোডটি পোর্টেবল - এটি কেবল বিভিন্ন আর্কিটেকচারে বিভিন্ন ক্রিয়াকলাপে সংকলন করে (সমস্ত অপশন যেমন করে)।
জিমওয়াইজ

7
আমি এই যুক্তিটি কিনছি না, কারণ বড়-এন্ডিয়ান আর্কিটেকচারে, কোনও পয়েন্টার শুরুতে বরং শেষের দিকে ইঙ্গিত করতে পারে যা আপনি উল্লেখ করছেন এবং আপনার ঠিক একই সুবিধা থাকতে চান।
ড্যান_ওয়াটারওয়ার্থ

4
@ উদ্যান_ ওয়াটারওয়ার্থ বেশ নয় - উদাহরণস্বরূপ সি এর পয়েন্টার গাণিতিক নিয়মগুলি মনে রাখবেন এবং যখন আপনি একই পয়েন্টারের বৃদ্ধি বা হ্রাস কাস্ট করেন তখন কী হয় happens আপনি জটিলতা সরিয়ে নিতে পারেন, তবে আপনি এটিকে সরাতে পারবেন না।
জিমওয়াই

45

আমি সর্বদা আশ্চর্য হই যে কেন কেউ বাইটগুলি বিপরীত ক্রমে সঞ্চয় করতে চায়।

বিগ-এন্ডিয়ান এবং লিটল-এন্ডিয়ান হ'ল মানুষের দৃষ্টিভঙ্গি থেকে কেবল "স্বাভাবিক আদেশ" এবং "বিপরীত ক্রম" এবং তারপরে এই সবগুলি সত্য হলেই ...

  1. আপনি পর্দায় বা কাগজে মানগুলি পড়ছেন।
  2. আপনি নীচে মেমরি ঠিকানাগুলি বামদিকে এবং উচ্চতর ডানদিকে রেখেছেন।
  3. আপনি হেক্সে লিখছেন, বাম দিকে হাই-অর্ডার নীব্বল বা বাইনারি সহ, খুব বাম দিকে উল্লেখযোগ্য বিট দিয়ে।
  4. আপনি বাম থেকে ডান পড়েন।

সেগুলি হ'ল সমস্ত মানবিক কনভেনশন যা কোনও সিপিইউতে মোটেই গুরুত্ব দেয় না। আপনি যদি # 1 এবং # 2 ধরে রাখেন এবং # 3 ফ্লিপ করেন তবে লিটল-এন্ডিয়ান হ'ল আরবি বা হিব্রু পড়তে এমন লোকদের কাছে "একেবারে প্রাকৃতিক" বলে মনে হয়, যা ডান থেকে বামে লেখা থাকে।

এবং অন্যান্য মানব সম্মেলনগুলি রয়েছে যেগুলি বড় আকারের করে তোলে যা অপ্রাকৃত বলে মনে হয়, যেমন ...

  • "উচ্চতর" (সর্বাধিক উল্লেখযোগ্য) বাইটটি "উচ্চতর" মেমরি ঠিকানায় হওয়া উচিত।

ফিরে যখন আমি বেশিরভাগ 68K এবং পাওয়ারপিসি প্রোগ্রাম করতাম, আমি বড়-এন্ডিয়ানকে "ডান" এবং ছোট্ট এন্ডিয়ানকে "ভুল" বলে মনে করি। তবে যেহেতু আমি আরও এআরএম এবং ইন্টেলের কাজ করছি, তাই আমি ছোট-এন্ডিয়ানদের অভ্যস্ত হয়ে পড়েছি। আসলেই কিছু যায় আসে না।


30
সংখ্যাগুলি আসলে [অতি তাৎপর্যপূর্ণ অঙ্ক] বাম থেকে [কমপক্ষে উল্লেখযোগ্য সংখ্যা] থেকে আরবী এবং হিব্রুতে ডানদিকে লেখা হয়।
র্যান্ডম 832

5
তাহলে কেন বাইটের মধ্যে বিটগুলি "বড় এন্ডিয়ান" ফর্ম্যাটে সংরক্ষণ করা হয়? ধারাবাহিক হবেনা কেন?
tskuzzy

11
সেগুলি হয় না - বিট 0 হ'ল কনভেনশন দ্বারা স্বল্পতম তাৎপর্যপূর্ণ এবং বিট 7 সবচেয়ে গুরুত্বপূর্ণ। তদতিরিক্ত, আপনি সাধারণত বাইটের মধ্যে বিটগুলিতে অর্ডার দিতে পারবেন না, যেহেতু বিটগুলি স্বতন্ত্রভাবে ঠিকানাযোগ্য নয়। অবশ্যই কোনও প্রদত্ত যোগাযোগ প্রোটোকল বা স্টোরেজ মিডিয়াতে তাদের শারীরিক অর্ডার থাকতে পারে তবে আপনি নিম্ন-স্তরের প্রোটোকল বা হার্ডওয়্যার স্তরে কাজ না করা না হলে আপনাকে এই আদেশ নিয়ে নিজেকে উদ্বেগ করার দরকার নেই।
স্টিয়ার্ট

3
নীলরাজ: কেবল কাগজে লেখার সম্মেলন করে। সিপিইউ আর্কিটেকচারের সাথে এর মিল নেই। আপনি বাইটটি 7-0 এমএসবি-এলএসবির পরিবর্তে 0-7 এলএসবি-এমএসবি হিসাবে লিখতে পারেন এবং অ্যালগরিদম দৃষ্টিকোণ থেকে কোনও পরিবর্তন হয় না।
এসএফ

2
@ এসএফ: "সংক্ষেপে পুশ করুন, শর্ট ছাড়াও যে কোনও কিছুই পপ করুন " যাইহোক আপনাকে চমকে দেবে। এমনকি আপনি কখনও পপ বা তদ্বিপরীত বাইটস ঠেলে স্ট্যাকটিকে দূষিত করছেন না যদিও ... x86 (32-বিট), উদাহরণস্বরূপ, সত্যই সত্য স্ট্যাকটি ডায়াড-অ্যালাইন্টেড হওয়া এবং ধাক্কা দেওয়ার বা পপিং করার কারণ যা কিছু ঘটায় স্ট্যাক পয়েন্টার 4 এর একাধিক না হওয়ার কারণে প্রান্তিককরণের সমস্যা হতে পারে। এবং তা না হলেও, স্টাফগুলি একবারে পুরো শব্দ / ডওয়ার্ড / কিওয়ার্ড / ইত্যাদি ধাক্কা দেয় - সুতরাং আপনি যখন পপ করবেন তখন লো বাইটটি আপনি প্রথম পাবেন।
সিএইচও

41

ঠিক আছে, এখানে কারণ হিসাবে এটি আমাকে ব্যাখ্যা করেছে: সংযোজন এবং বিয়োগফল

আপনি যখন বহু-বাইট সংখ্যা যুক্ত বা বিয়োগ করবেন তখন আপনাকে কমপক্ষে উল্লেখযোগ্য বাইট দিয়ে শুরু করতে হবে। উদাহরণস্বরূপ আপনি যদি দুটি 16-বিট সংখ্যা যুক্ত করে থাকেন তবে সর্বনিম্ন উল্লেখযোগ্য বাইট থেকে সর্বাধিক তাৎপর্য্য বাইট পর্যন্ত একটি ক্যারি থাকতে পারে, তাই ক্যারি রয়েছে কিনা তা দেখতে আপনাকে কমপক্ষে উল্লেখযোগ্য বাইট দিয়ে শুরু করতে হবে। লংহ্যান্ড সংযোজন করার সময় আপনি ঠিক একই অঙ্কটি শুরু করেছিলেন। আপনি বাম থেকে শুরু করতে পারবেন না।

একটি 8-বিট সিস্টেম বিবেচনা করুন যা মেমরি থেকে ধারাবাহিকভাবে বাইটগুলি নিয়ে আসে। যদি এটি প্রথমে সর্বনিম্ন উল্লেখযোগ্য বাইট আনে, এটি সর্বাধিক উল্লেখযোগ্য বাইট মেমরি থেকে আনার সময় এটি করা শুরু করতে পারে । এই সমান্তরালতা হ'ল সিস্টেমের মতো সামান্য এডিয়ানগুলিতে পারফরম্যান্স আরও ভাল। যদি উভয় বাইট স্মৃতি থেকে আনার জন্য অপেক্ষা করতে হয় বা বিপরীত ক্রমে এনেছিল তবে এটি বেশি সময় নিতে পারে।

এটি পুরানো 8-বিট সিস্টেমে রয়েছে। একটি আধুনিক সিপিইউতে আমি সন্দেহ করি যে বাইট ক্রমের ফলে কোনও তফাত আসে এবং আমরা কেবল historicalতিহাসিক কারণে সামান্য এডিয়ান ব্যবহার করি।


3
আহ - সুতরাং এটি প্রায় একই কারণ আমি বড় সংখ্যার জন্য ছোট-এন্ডিয়ান অংশ ব্যবহার করে। আমার এটা করা উচিত ছিল। লোকেরা এখনই সাইবারনেটিক্স নিয়ে কাজ করা দরকার - আমার মস্তিষ্কের ইতিমধ্যে কিছু প্রতিস্থাপনের অংশ এবং কিছু র‌্যাডিকাল আপগ্রেডের মরিয়া প্রয়োজন, আমি চিরকাল অপেক্ষা করতে পারি না!
স্টিভ 314

2
একটি চিন্তা - 6502 হার্ডওয়ারে খুব বেশি 16-বিট গণিত করতে পারেনি - এটি পরে ছিল একটি 8 বিট প্রসেসর। কিন্তু এটা করেনি আপেক্ষিক না অ্যাড্রেসিং, 8-বিট সাইন্ড একটি 16 বিট বেস ঠিকানায় আপেক্ষিক অফসেট ব্যবহার করে।
স্টিভ 314

2
নোট করুন যে এই ধারণাটি এখনও একাধিক যথার্থ পূর্ণসংখ্যার গাণিতিক (স্টিভ 314 দ্বারা বলা হয়েছে), তবে শব্দ স্তরের ক্ষেত্রে গুরুত্বপূর্ণ। এখন, বেশিরভাগ অপারেশনগুলি প্রসেসরের অন্তর্নিহিততার দ্বারা সরাসরি প্রভাবিত হয় না: GMP দ্বারা করা হিসাবে এখনও কেউ একটি বিগ-এন্ডিয়ান সিস্টেমে প্রথমে কমপক্ষে উল্লেখযোগ্য শব্দ সংরক্ষণ করতে পারে। লিটল-এন্ডিয়ান প্রসেসরগুলির কয়েকটি অপারেশনগুলির জন্য এখনও একটি সুবিধা রয়েছে (উদাহরণস্বরূপ কিছু স্ট্রিং রূপান্তর?) যেগুলি একবারে একটি বাইট পড়ে সহজেই করা যায়, যেহেতু কেবল সামান্য-এন্ডিয়ান সিস্টেমে এই জাতীয় সংখ্যার বাইট ক্রম সঠিক।
ভিঙ্ক 17

স্মৃতি ব্যান্ডউইথের সীমাবদ্ধতার ক্ষেত্রে লিটল এন্ডিয়ান প্রসেসরের একটি সুবিধা রয়েছে যেমন 16-বিট মেমরি বাস সহ কিছু 32-বিট এআরএম প্রসেসরের মতো বা 8-বিট ডেটা বাসের সাথে 8088: প্রসেসরটি কেবলমাত্র নিম্ন অর্ধেক লোড করতে পারে এবং করতে পারে অ্যাড / সাব / মুল ... এর সাথে উচ্চতর অর্ধের জন্য অপেক্ষা করতে থাকুন
ফুলচলভি

13

8 বিট প্রসেসরের সাহায্যে এটি অবশ্যই আরও কার্যকর ছিল, আপনি বিভিন্ন কোডের প্রয়োজন ছাড়াই এবং অতিরিক্ত মান বাফার না করেই একটি 8 বা 16 বিট অপারেশন করতে পারবেন।

আপনি যদি কোনও সময়ে বাইট নিয়ে কাজ করে থাকেন তবে কিছু সংযোজন ক্রিয়াকলাপগুলির পক্ষে এটি আরও ভাল।

তবে বিগ-এন্ডিয়ান বেশি প্রাকৃতিক হওয়ার কোনও কারণ নেই - ইংরেজিতে আপনি তেরটি (ছোট এন্ডিয়ান) এবং তেইশটি (বিগ এন্ডিয়ান) ব্যবহার করেন


1
বিগ-এন্ডিয়ান মানুষের পক্ষে সত্যই সহজ কারণ এটি বাইটগুলি পুনরায় সাজানোর প্রয়োজন হয় না। উদাহরণস্বরূপ, একটি পিসিতে এটি কোনও বিই সিস্টেমে 0x12345678সংরক্ষণ করা 78 56 34 12হয় 12 34 56 78(বাইট 0 বাম দিকে থাকে, বাইট 3 ডানদিকে থাকে)। নোটটি কত বড় (বিটের শর্তে) এটি তত বেশি অদলবদলের প্রয়োজন; একটি ওয়ার্ডের জন্য একটি বদলের প্রয়োজন; একটি ডিডাব্লর্ড, দুটি পাস (তিনটি মোট সোয়াপ); একটি কিউবিআরডির তিনটি পাস (মোট মোট 7) এবং আরও। যে, (bits/8)-1অদলবদল। আরেকটি বিকল্প হ'ল তাদের উভয়কে সামনে এবং পিছনের দিকে পড়া (প্রতিটি বাইট ফরোয়ার্ড পড়া, তবে পুরো # পিছনের দিকে স্ক্যান করা)।
সিনিটেক

একশো-তের-হ'ল হয় মধ্য-এডিয়ান বা অন্যথায় "তেরো" মূলত এক দশমিক অংকযুক্ত বিগ-এন্ডিয়ান। যখন আমরা সংখ্যার বানান করি, তখন আমরা সংখ্যার জন্য যে ধ্রুবক-বেস কনভেনশনগুলি ব্যবহার করি সেগুলি থেকে কিছু ছোটখাটো বিচ্যুতি ঘটে তবে একবার আপনি যদি বিশেষ ক্ষেত্রগুলি বের করেন তবে বাকিগুলি বড়-ইন্ডিয়ান - কয়েক মিলিয়ন আগে, কয়েক হাজার আগে কয়েক হাজার
স্টিভ 314

@ সিনেটেক- ভাগ্যক্রমে কম্পিউটার কীভাবে মানুষ সেগুলি পড়বে সে বিষয়ে কম্পিউটারের কোনও যত্ন নেই। এটি দাবি করার মতো যে ন্যান্ড ফ্ল্যাশ আরও ভাল কারণ ওটি '
মার্টিন বেকেট

1
@ স্টিভ 314, সংখ্যার বানানযুক্ত শব্দের কিছু যায় আসে না, এটি প্রোগ্রামিংয়ের সময় আমরা ব্যবহার করি এটি সংখ্যার পাঠ্য। মার্টিন, কোনও কম্পিউটারকে মানুষ কীভাবে সংখ্যা পড়তে হবে সেদিকে খেয়াল রাখার দরকার নেই, তবে যদি মানুষের পক্ষে সেগুলি পড়া সহজ হয় তবে প্রোগ্রামিং (বা অন্যান্য সম্পর্কিত কাজ) সহজ হয়ে যায় এবং কিছু ত্রুটি এবং বাগগুলি হ্রাস বা এড়ানো যায়।
সিনিটেক

@ স্টিভ 314 এবং ডেনিশ ভাষায়, "95" এর উচ্চারণ "ফেম হালফেমস" (পাঁচটি, আরও সাড়ে চার দশক)।
ভ্যাটাইন

7

জাপানি তারিখের সম্মেলনটি "বিগ এন্ডিয়ান" - ইয়ে / মিমি / ডিডি। এটি অ্যালগরিদম বাছাইয়ের জন্য সহজ, যা সাধারণ প্রথম-অক্ষর-সবচেয়ে-উল্লেখযোগ্য নিয়মের সাথে একটি সাধারণ স্ট্রিং-তুলনা ব্যবহার করতে পারে।

সর্বাধিক তাৎপর্যপূর্ণ-ফিল্ড-প্রথম রেকর্ডে সঞ্চিত বিগ-এন্ডিয়ান সংখ্যাগুলির জন্য অনুরূপ কিছু প্রযোজ্য। ক্ষেত্রগুলির মধ্যে বাইটগুলির তাত্পর্য 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 বিট (ডাবল বাইট) স্টাফ সর্বাধিক অর্ডার করা হয় ... সর্বনিম্ন। অর্থাৎ, ছোট ঠিকানার সর্বাধিক উল্লেখযোগ্য বাইট রয়েছে - এত বড় এন্ডিয়ান।

আপনি যদি এর পরিবর্তে সামান্য এডিয়ান ব্যবহার করে লোড করার চেষ্টা করেন, আপনাকে আপনার প্রশস্ত নিবন্ধের নীচের অংশে একটি বাইট লোড করতে হবে, তারপরে পরবর্তী বাইটটি স্টেজিং এরিয়াতে লোড করুন, এটিকে স্থানান্তর করুন এবং তারপরে এটিকে আপনার বিস্তৃত নিবন্ধের শীর্ষে পপ করুন । বা উপরের বা নীচে বাইটে নির্বাচন করে লোড করতে সক্ষম হওয়ার জন্য গেটিংয়ের আরও জটিল বিন্যাস ব্যবহার করুন।

সামান্য এন্ডিয়ান যাওয়ার চেষ্টা করার ফলাফলটি হল আপনার আরও সিলিকন (সুইচ এবং গেটস), বা আরও বেশি ক্রিয়াকলাপ প্রয়োজন।

অন্য কথায়, পুরানো দিনগুলিতে বক ফেরত পাওয়ার ক্ষেত্রে, আপনি বেশিরভাগ পারফরম্যান্স এবং ক্ষুদ্রতম সিলিকন অঞ্চলের জন্য আরও বেশি ঠাঁই পেয়েছিলেন।

আজকাল, এই কারণগুলো এবং প্রায় কাছাকাছি অপ্রাসঙ্গিক কিন্তু পাইপলাইন ভরাট ভালো জিনিস হতে পারে এখনও একটি বড় চুক্তি একটি বিট হতে।

যখন এস / ডব্লু লেখার কথা আসে তখন অল্প ইন্ডিয়ান অ্যাড্রেসিং ব্যবহার করার সময় জীবন প্রায়শই সহজ হয়।

(এবং বিট-ইন-বাইটের ক্ষেত্রে বড় এন্ডিয়ান প্রসেসরগুলি বাইট অর্ডারিং এবং সামান্য এন্ডিয়ান হিসাবে প্রবণতা রয়েছে But তবে কিছু প্রসেসর অদ্ভুত এবং বিগ অর্ডারের পাশাপাশি বিগ অর্ডারিং বিগ অর্ডারও ব্যবহার করবে This এটি জীবনকে খুব সুন্দর করে তোলে এইচ / ডাব্লু ডিজাইনারের জন্য মেমরি-ম্যাপযুক্ত পেরিফেরিয়াল যুক্ত করার জন্য আকর্ষণীয় তবে এটি প্রোগ্রামারটির অন্য কোনও পরিণতি নয়))


3

জিমওয়াইস একটি ভাল পয়েন্ট তৈরি। আরেকটি সমস্যা আছে, সামান্য এডিয়ানতে আপনি নিম্নলিখিতটি করতে পারেন:

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
মার্টিন ভিলক্যানস

@ মার্টিন: আমার বইতে আরও কম বিয়োগ ভাল
সিএম ক্যালিয়েন্সু

কম্পাইলার যেভাবেই লুপটি আনরোল করে দেবে তাই এটি আসলেই কিছু যায় আসে না। যে কোনও ক্ষেত্রে, অনেক সিপিইউতে এই সমস্যাটি পরিচালনা করতে বাইট অদলবদলের নির্দেশনা রয়েছে।
মার্টিন ভিলকান্স

আমি বড় এন্ডিয়ানতে বোকোজ সম্মত নই, আমি i নাম << = 8 করব; num | = ডেটা [i]; least কমপক্ষে
এটিতে

@ অলি: আপনার কোডটি আমি লিখেছিলাম ঠিক একই কাজ করবে এবং বড় এন্ডিয়ানে কাজ করবে না।
কেম কল্যাঙ্কু

1

আমি সর্বদা আশ্চর্য হই যে কেন কেউ বাইটগুলি বিপরীত ক্রমে সঞ্চয় করতে চায়

দশমিক সংখ্যা বড় এন্ডিয়ান লেখা হয়। আপনি এটি ইংরেজিতে কীভাবে লিখেন তাও আপনি সর্বাধিক উল্লেখযোগ্য অঙ্ক এবং পরবর্তী সর্বাধিক উল্লেখযোগ্য থেকে সবচেয়ে গুরুত্বপূর্ণ হিসাবে শুরু করেন। যেমন

1234

এক হাজার দুইশত চৌত্রিশটি।

এইভাবে বড় এন্ডিয়ানকে কখনও কখনও প্রাকৃতিক ক্রম বলা হয়।

সামান্য এডিয়ান ভাষায়, এই সংখ্যাটি এক, বিশ, তিনশ এবং চার হাজার হবে।

তবে, আপনি যখন যোগ বা বিয়োগের মতো পাটিগণিত সম্পাদন করেন, আপনি শেষ দিয়ে শুরু করবেন।

  1234
+ 0567
  ====

আপনি 4 এবং 7 দিয়ে শুরু করুন, সর্বনিম্ন অঙ্কটি লিখুন এবং ক্যারিটি মনে রাখবেন। তারপরে আপনি 3 এবং 6 ইত্যাদি যোগ করুন, বিয়োগ বা তুলনা করার জন্য এটি প্রয়োগ করা সহজ, যদি আপনার ইতিমধ্যে মেমরিটি ক্রম অনুসারে পড়ার যুক্তি থাকে, যদি নম্বরগুলি বিপরীত হয়।

বড় এড়িয়ানকে এইভাবে সমর্থন করতে আপনার বিপরীতে মেমরি পড়ার জন্য যুক্তি প্রয়োজন, অথবা আপনার আরআইএসসি প্রক্রিয়া রয়েছে যা কেবল রেজিস্টারে চালিত হয়। ;)

অনেকগুলি ইন্টেল x86 / এমএডি x64 নকশা .তিহাসিক।


0

বিগ-এন্ডিয়ান কিছু ক্রিয়াকলাপের জন্য দরকারী (সমান অক্টেট দৈর্ঘ্যের স্প্রিংগুলিকে মনে রাখার জন্য "বিগাইনস" এর তুলনা)। অন্যদের জন্য লিটল-এডিয়ান (সম্ভবত দুটি "বিগাইনাম" যুক্ত করুন)। শেষ পর্যন্ত, এটি সিপিইউ হার্ডওয়্যারটি কীসের জন্য সেটআপ করা হয়েছে তার উপর নির্ভর করে, এটি সাধারণত এক বা অন্যটি হয় (কিছু এমআইপিএস চিপগুলি আইআইআরসি, এলই বা বিই হতে বুটটিতে পরিবর্তনযোগ্য)।


0

যখন কেবলমাত্র পরিবর্তনশীল দৈর্ঘ্য সহ স্টোরেজ এবং স্থানান্তর জড়িত থাকে, তবে একাধিক মান সহ কোনও গাণিতিক হয় না, তখন লে সাধারণত লেখার পক্ষে সহজ হয়, তবে বিই পড়া সহজ হয়।

আসুন একটি নির্দিষ্ট উদাহরণ হিসাবে একটি ইন-টু-স্ট্রিং রূপান্তর (এবং পিছনে) নেওয়া যাক।

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

এখন বিআর ক্রমে একই চেষ্টা করুন। সাধারণত আপনার আর একটি বিভাজকের প্রয়োজন যা নির্দিষ্ট সংখ্যার জন্য এখানে 10 এর বৃহত্তম শক্তি রাখে (এখানে 100)। আপনার অবশ্যই এটি প্রথম খুঁজে পাওয়া দরকার। আরও অনেক কিছু করতে হবে।

বিআর তে স্ট্রিং টু ইন্টার রূপান্তর করা সহজ, যখন এটি বিপরীত লিখন অপারেশন হিসাবে করা হয়। স্টোরগুলিকে সবচেয়ে গুরুত্বপূর্ণ অঙ্কটি সর্বশেষে লিখুন, সুতরাং এটি প্রথমে পড়া উচিত।

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 দ্বারা গুণিত হবে।

সুতরাং আমি সাধারণত স্টোরের জন্য বিই ব্যবহার করতে পছন্দ করি, কারণ একটি মান ঠিক একবার লেখা হয় তবে কমপক্ষে একবার এবং সম্ভবত বহুবার পড়ে। এর সহজ কাঠামোর জন্য, আমি সাধারণত এলই তে রূপান্তর করতে রুটটিও যাই এবং তারপরে ফলাফলটি বিপরীত করি, এমনকি যদি এটি দ্বিতীয়বারের মতো মানটি লিখে দেয়।

বিই স্টোরেজের জন্য আরেকটি উদাহরণ হ'ল ইউটিএফ -8 এনকোডিং এবং আরও অনেক কিছু।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.