البرمجة

لماذا تعود عملية 1ul << 64 بقيمة 1 في لغة البرمجة C؟

في هذا السياق، يبدو أن هناك خلطًا يحدث في تفسير نتائج عملية الشيفت اليسرى للرقم 1 بوحدة طويلة غير موقعة (unsigned long) بـ 64 بتًا. لفهم هذا الظاهرة، دعونا نقوم بتحليل الكود وفهم سبب تصرف البرنامج بالطريقة التي تم وصفها.

في الكود المقدم، يتم تهيئة متغير x بنوع unsigned long بقيمة صفر، ثم يتم الدخول في حلقة تكرار يتم فيها تنفيذ عملية الشيفت اليسرى للرقم 1 بوحدة عدد مرات تكرار الحلقة. وعندما يتم الوصول إلى التكرار الـ64، يتم تنفيذ الشيفت اليسرى باستخدام العملية (1ul << i) ويتم طباعة النتيجة.

التفسير الصحيح للظاهرة هو أن نتيجة الشيفت اليسرى للرقم 1 بوحدة لـ64 مرة يؤدي إلى قيمة 1، وليس الصفر كما هو متوقع. يحدث هذا بسبب خصائص الشيفت اليسرى في لغة البرمجة C، حيث يتم استخدام البتات الفارغة لتخزين القيمة الزائدة عن عرض النوع.

في الحقيقة، يعتبر الشيفت اليسرى بوحدة للقيمة 1 هو عملية ذات معنى في لغة البرمجة C، وعندما نقوم بشيفت الرقم 1 بوحدة لـ64 مرة، يظل البت الأقل أهمية هو 1، وليس 0 كما قد يتوقع البعض. ولذلك، يتم طباعة القيمة 1 في هذا السياق.

يمكننا أن نقول أن هذا السلوك الذي قد يبدو غريبًا هو ناتج من خصائص لغة البرمجة C وكيفية تنفيذ عمليات الشيفت فيها.

المزيد من المعلومات

لفهم هذا السلوك بشكل أعمق، يجب أن نلقي نظرة على كيفية عمل عملية الشيفت اليسرى في لغة البرمجة C على الأنواع غير الموقعة (unsigned types). في لغة C، يُعتبر الشيفت اليسرى للقيمة بوحدة واحدة كعملية تضاعف، وهذا يعني أنه يتم تضاعف قيمة الرقم المشفر بكل شيفت.

عندما نقوم بشيفت الرقم 1 بوحدة لـ64 مرة، يحدث التضاعف 64 مرة، وبما أن لدينا نوع غير موقع (unsigned) وبعرض 64 بت، فإن القيمة النهائية ستكون 2^64، وهي تمثل القيمة 1 تضاعفت 64 مرة.

السبب في أن القيمة المطبوعة هي 1 وليس 0، حتى عندما يكون الشيفت اليسرى للقيمة 1 بوحدة لـ64 مرة، هو بسبب كيفية تعامل لغة C مع البتات الفارغة. في الحقيقة، لا يتم تفريغ القيمة إلى الصفر، وإنما تتم استخدام البتات الفارغة لتمثيل القيمة الزائدة عن حجم النوع.

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

زر الذهاب إلى الأعلى