>`) في لغة C تنتج نتائج غير متوقعة عند الإزاحة بمقدار 32 بت؟ " />
سلوك غير متوقع لمشغل التحول الأيمن (1 >> 32)
في مجال البرمجة، يُستخدم عامل التحول الأيمن (>>) بشكل شائع لإجراء عمليات على مستوى البت، خاصة لقسمة عدد صحيح على قوة اثنين، ومع ذلك، يمكن أن ينشأ سلوك غريب عند الإزاحة بقيم أكبر، كما هو موضح في لغة C التالية الكود:
int foo(int a, int b) {
return a >> b;
}
int bar(uint64_t a, int b) {
return a >> b;
}
int main() {
std::cout > 32: " > 32) > (int)32: " > (int)32) من المثير للدهشة أن مخرجات هذا البرنامج تكشف عن نتائج غير متوقعة:
foo(1, 32): 1 // Should be 0
bar(1, 32): 0
1 >> 32: 0
(int)1 >> (int)32: 0
يكمن الأساس المنطقي وراء هذه النتائج في العمل الداخلي لوحدة المعالجة المركزية والمترجم.
سلوك وظيفة foo()
في الدالة foo()، يتم تنفيذ عملية الإزاحة بدون تحويل، مما يؤدي إلى قيام وحدة المعالجة المركزية بإجراء إزاحة منطقية لليمين. في العديد من البنيات، يتم تنفيذ الإزاحة المنطقية لليمين على أنها >> (b % 32)، مع تجاهل البتات العلوية لـ b بشكل فعال. لذلك، foo(1, 32) ينتج عنه 1 >> (32 % 32)، والذي يتم تقييمه إلى 1 >> 0، مما يؤدي إلى 1.
لماذا يعد الإرسال إلى عدد صحيح 64 بت أمرًا مهمًا؟
في الدالة bar()، يتم توفير عدد صحيح غير موقّع 64 بت، مما يضمن ضمان أن تكون النتيجة 0 لأن b (32) أقل من عدد البتات في المعامل (64). ومع ذلك، عندما يتم تغيير b إلى 64، تصبح النتيجة غير متوقعة وقد تستمر في الحصول على 1.
تحسين المترجم
في حالة 1 >> 32 و (int )1 >> (int)32، يقوم المترجم بتحسين هذه التعبيرات الثابتة في وقت الترجمة. يحدد المعيار سلوكًا غير محدد للإزاحات اليمنى حيث يكون العدد سالبًا أو أكبر من أو يساوي طول المعامل. نظرًا لأن 32 يتجاوز طول المعامل، لا يمكن للمترجم تحديد النتيجة والمخرجات 0 كبديل آمن.
السلوك الخاص بوحدة المعالجة المركزية تنفيذ التحول الصحيح يمكن أن تختلف العمليات عبر وحدات المعالجة المركزية المختلفة. في معماريات x86/x86-64، يكون الإزاحة المنطقية لليمين بشكل فعال >> (b % 32 أو 64)، اعتمادًا على الوضع. ومع ذلك، في معالجات ARM، تضمن عملية النقل الصحيح صفرًا للتحولات الأكبر من أو تساوي 32.
الاستنتاج
عند العمل مع مشغلي التحول الأيمن، فمن الضروري للنظر في السلوكيات المحتملة غير المحددة، خاصة عندما يتجاوز عدد التحولات طول المعامل. يمكن أن يضمن النقل إلى أنواع أعداد صحيحة أوسع، مثل أعداد صحيحة 64 بت، نتائج متسقة عبر وحدات المعالجة المركزية والمترجمات المختلفة.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3