يلقي شار إلى قصيرة غير موقعة: ما يحدث وراء الكواليس؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

ونظرا لهذا الحقل:

char lookup_ext[8192] = {0}; // Gets filled later

وهذا البيان:

unsigned short *slt = (unsigned short*) lookup_ext;

وماذا يحدث وراء الكواليس؟

وlookup_ext [1669] إلى عرض 67 = 0100 0011 (C)، lookup_ext [1670] بإرجاع 78 = 0100 1110 (N) وlookup_ext [1671] بإرجاع 68 = 0100 0100 (D)؛ بعد SLT [1670] بإرجاع 18273 = 0100 0111 0110 0001.

وأنا أحاول أن الميناء هذا إلى C #، وذلك إلى جانب طريقة سهلة للخروج من هذا، وأنا أتساءل أيضا ما يحدث حقا هنا. تم منذ بعض الوقت اعتدت C ++ بانتظام.

وشكرا!

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

المحلول

والبيان أن تظهر لك لا يلقي شار إلى قصيرة غير موقعة، فإنه يلقي <م> المؤشر إلى شار إلى <م> المؤشر إلى قصيرة غير موقعة. وهذا يعني أن التحويلات الحسابية المعتادة للبيانات أشار إلى ما لن يحدث، وأنه سوف يكون مجرد تفسير البيانات شار الكامنة كما السراويل غير موقعة عند الوصول إليها من خلال المتغير slt.

لاحظ أن sizeof(unsigned short) غير المرجح أن تكون واحدة، وبالتالي فإن هذا slt[1670] لا تتوافق بالضرورة إلى lookup_ext[1670]. فمن المرجح - إذا، ويقول، sizeof(unsigned short) هي سنتان - لتتوافق مع lookup_ext[3340] وlookup_ext[3341]

هل تعرف لماذا رمز الأصلي يستخدم هذه التعرجات؟ إذا لم يكن ضروريا، فإنه قد يكون من المفيد محاولة لجعل C ++ كود نظافة والتحقق من أن السلوك لم يتغير قبل ترقية عليه.

نصائح أخرى

إذا فهمت بشكل صحيح، فإن تحويل نوع يكون تحويل صفيف حرف من حجم 8192 إلى مجموعة كثافة العمليات قصيرة من حجم نصف ذلك، وهو 4096.

وهكذا أنا لا أفهم ما كنت مقارنة في سؤالك. SLT [1670] يجب أن تتوافق مع lookup_ext [1670 * 2] وlookup_ext [1670 * 2 + 1].

حسنا، هذا البيان

char lookup_ext[8192] = {0}; // Gets filled later

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

unsigned short *slt = (unsigned short*) lookup_ext;

وهذا سوف تفسير بايت التي تشكل مجموعة ككائنات قصيرة غير موقعة عند قراءة من هدف هذا المؤشر ل. بالمعنى الدقيق للكلمة، ما سبق هو سلوك غير معرف، لأنه لا يمكن أن تكون على يقين من مجموعة مناسبة الانحياز، وكنت قرأت من المؤشر الذي ليست لافتا في نوع من نوع أشار الأصلي (الحرف غير الموقعة <-> غير موقعة قصيرة). في C ++، فإن الطريقة الوحيدة المحمولة لقراءة قيمة من بعض جراب الأخرى (البيانات القديمة عادي. هذا كل البنيات وأنواع البسيطة التي من الممكن في C جدا (مثل قصيرة)، بصفة عامة) هو عن طريق استخدام هذه الوظائف المكتبة كما memcpy أو memmove.

وحتى إذا كنت تقرأ *slt أعلاه، هل تفسير بايت sizeof(*slt) الأولى من مجموعة، ومحاولة قراءتها في غير موقعة قصيرة (وهذا يسمى type pun).

وعند القيام "غير موقعة قصيرة <م> SLT = (غير موقعة قصيرة ) lookup_ext،" لا. بايت أي ما يعادل حجم يتم انتقاؤها (غير موقعة قصيرة) ارتفاعا من موقع معين من قبل lookup_ext، وتخزينها في الموقع المشار إليه من قبل SLT. منذ قصيرة غير الموقعة سيكون 2 بايت، سيتم تخزين بايت الأولين من lookup_ext في موقع معين من قبل SLT.

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