سؤال

هذا سؤال بسيط جدا.لقد لاحظت أن ما يلي، عند تجميعه في MSVS2012، ينتج عنه ملف مُتوقع نتيجة ل 0x3412 ل val:

unsigned char test[] = { 0x12, 0x34, 0x56, 0x78 };
unsigned char* ch = test;
unsigned int val = *ch | (*(ch+1) << 8);

كنت أتوقع بالفعل مؤشر char الذي تم إلغاء الإشارة إليه *(ch+1) على الحق في إنتاج أ شار قيمة ال 0x34, ، والتي سيتم بعد ذلك إزاحتها إلى اليسار لإنتاج 8 بتات 0x00.يبدو أنه عند هذه النقطة الزمنية يتم إلغاء الإشارة إلى القيمة، حيث يتم تخزينها بالفعل في نوع كبير بما يكفي ليحتوي على بايتين على الأقل.

هل هذا محدد في سي ++ القياسية في مكان ما؟كيف بالضبط يحدث هذا التمثيل الضمني؟

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

المحلول

يتم تغطية هذا تحت مشروع معيار C++ قسم 5.8 مشغلي التحول فقرة 1 الذي يقول:

[...] يجب أن تكون المعاملات من نوع التعداد المتكامل أو غير المحدد ويتم تنفيذ الترقيات المتكاملة.[...]

و الترقيات المتكاملة يتم تغطيتها في القسم 4.5 ترقيات متكاملة التي في الفقرة 1 يقول:

يمكن تحويل القيمة الأولية لنوع عدد صحيح بخلاف bool أو char16_t أو char32_t أو wchar_t الذي تكون رتبة تحويل الأعداد الصحيحة فيه (4.13) أقل من رتبة int إلى قيمة أولية من النوع int إذا كان int يمكن أن يمثل جميع قيم النوع المصدر ;وبخلاف ذلك، يمكن تحويل القيمة الأولية للمصدر إلى قيمة أولية من النوع int غير الموقع.

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