كيف يتم تشغيل كل بايت في عدد صحيح مخزنا في وحدة المعالجة المركزية / الذاكرة؟

StackOverflow https://stackoverflow.com/questions/1842187

  •  12-09-2019
  •  | 
  •  

سؤال

لقد حاولت هذا

char c[4];
int i=89;
memcpy(&c[0],&i,4);
cout<<(int)c[0]<<endl;
cout<<(int)c[1]<<endl;
cout<<(int)c[2]<<endl;
cout<<(int)c[3]<<endl;

الناتج هو مثل:
89
0
0
0

التي تدرب جميلة StoMache Cuz التي اعتقدت أن الرقم سيتم حفظه في الذاكرة مثل 0x00000059 فكيف يأتي C [0] هو 89؟ اعتقدت أنه من المفترض أن يكون في C [3] ...

هل كانت مفيدة؟

المحلول

لأن المعالج الذي تقوم بتشغيله هو قليلا النصر. وبعد يتم تبديل النظام البايت، من نوع أساسي متعدد البايت،. على آلة كبيرة الإناهة سيكون كما تتوقع.

نصائح أخرى

هذا لأنك تقوم بتشغيل البرنامج على الإندان الصغير وحدة المعالجة المركزية. انظر أيضا الانتخاب هنا و هناك.

من الواضح أن الإندان - نيس هو الجواب كما أشار جوز إلى الخارج.

ولكن بالنسبة لأولئك الذين ليسوا غير واضحين من هذا يعني ذلك، من المهم أيضا أن نفهم أن ترتيب البايت المعروض في المثال هو نفس الترتيب في INT INT الأصلي. MAMCPY لا يغير النظام البايت، بغض النظر عن نوع EDIAN من النظام الأساسي.

لأن النظام البايت هو قرار تصميم تعسفي. مرة واحدة في سجل، لا يوجد طلب البايت1.

ينشأ بايت أمر عندما نتعامل مع وحدات أصغر مثل بايت. إنه قرار تعسفي أساسا، يحصل مصمم وحدة المعالجة المركزية على جعل: نبيذ كبير أو طفيف.

من المفيد تبسيط الموقف وإدراك أنه في الأساس الاتصال بالأجهزة الطرفية التي أمرت البايت. نعم، يمكن اكتشافها عبر معالجة البايت كما أثبتت، ولكن في قيم العددية العامة يتم تحميلها وتخزينها كوحدات، في سجلات، وفي حالة بايت هذه الحالة لا يغير أي شيء. الأجزاء الأكثر أهمية في "اليسار"، على الأقل، الطريقة التي عادة ما تكتب الأرقام. وهذا هو السبب << و >> يقوم المشغلون دائما بتنتج النتائج بالضبط نفس النتائج على آلات إينتيان صغيرة كبيرة عند استخدامها وفقا لمعايير اللغة.

ولكن من أجل قراءة وكتابة تدفقات البيانات للأجهزة الطرفية، يمكنك إجبارك على اختيار أمر بايت. وذلك لأن الأجهزة الطرفية هي أجهزة دفق البايت بشكل أساسي. هل أدنى عنوان له الأجزاء الأكثر أهمية أو أقل؟ لقد تم ذلك في كلتا الاتجاهين والمعسكرات المستخدمة لتكون منقوشة بالتساوي.

نظرا لأن الذاكرة نفسها هي بايت، فمن الممكن بالتأكيد أن تستمد سلوكا مختلفا دون طرفي، ولكن هذا عادة لا يحدث بدون نظرة خاطفة متعمدة في الداخل كما فعلت.

تخيل وحدة المعالجة المركزية التي لا تحتوي على بايت، فقط الكلمات 32 بت، معالجتها ك 0، 1، 2. مترجم C يجعل char، int، وطويلة الكائنات 32 بت طويلة. (هذا يسمح به CX9.) نجاح باهر، لا مشاكل ترتيب البايت! انه الاثنين! ولكن .. ما يحدث عندما نرفع أول طرفي؟


1.حسنا، سجل X86 يسجل سجلات المستعار الأصغر، ولكن هذه قصة أخرى.

يمكن أن تحتوي الأجهزة المختلفة على طلب بايت مختلف، ولكن إلقاء نظرة على هذا الرمز والتفكير في ما يحدث، اعتمادا على كيفية قيام البايتات بها:

long x = 89;
short *p = (short*)&x;
short y = *p;

إذا كنت ترغب في أن يكون طلبك محمولا أو متطورا داخل فريق، فمن المحتمل أن لا ترغب في اتباع هذا المنطق لأنه سيؤدي إلى صعوبة في التقاط الأخطاء وإطالة التطوير.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top