تجاوز عدد صحيح - لماذا لا [مكررة]
-
14-11-2019 - |
سؤال
التكرار المحتمل:
إضافة حرفين ينتج عنه int
بالنظر إلى كود C++ التالي:
unsigned char a = 200;
unsigned char b = 100;
unsigned char c = (a + b) / 2;
الناتج هو 150 كما منطقيا متوقع، ولكن لا ينبغي أن يكون هناك تجاوز لعدد صحيح في التعبير (a + b)
?
من الواضح أنه يجب أن يكون هناك ترقية صحيحة للتعامل مع الفائض هنا، أو أن شيئًا آخر يحدث ولا أستطيع رؤيته.كنت أتساءل عما إذا كان يمكن لأي شخص أن ينيرني حتى أتمكن من معرفة ما يمكنني الاعتماد عليه وما لا ينبغي الاعتماد عليه فيما يتعلق بالترويج الصحيح والتجاوز.
المحلول
لا تقوم لغة C++ ولا لغة C بإجراء حسابات حسابية باستخدام أنواع أعداد صحيحة "أصغر" مثل، char
و short
.تتم ترقية هذه الأنواع دائمًا تقريبًا إلى int
قبل أن تبدأ أي حسابات أخرى.لذا، يتم تقييم تعبيرك حقًا على أنه
unsigned char c = ((int) a + (int) b) / 2;
ملاحظة.على بعض المنصات الغريبة حيث نطاق int
لا يغطي نطاق unsigned char
, ، نوع unsigned int
سيتم استخدامه كنوع مستهدف للترقية.
نصائح أخرى
لا، هذا ليس خطأ.
يحسب المترجم دائمًا الحد الأدنى من دقة الأعداد الصحيحة، وسيتم تحويل النتيجة مرة أخرى إلى حرف غير موقع عند المهمة فقط.
هذا في المعيار.
لكل إجابات أخرى، هذا ليس خطأ على نظام التشغيل x86 والبنيات الأخرى (العاقلة) 32 بت و16 بت.
ومع ذلك، في البنى الأصغر أو الأقل عقلانية (عادةً وحدات التحكم الدقيقة الصغيرة جدًا) من المحتمل أن تبدأ أشياء مثل هذه في التسبب في مشاكل، خاصة إذا كان من قام بتنفيذ برنامج التحويل البرمجي الخاص بك لا يملك ميزانية الاختبار/التحقق من صحة بعض الشركات الكبرى الموجودة هناك (مرة أخرى، ميكروكنترولر).