السلام عليكم
كنت اكتب شيفرة امنة لضرب عددين من نوع int و بحجم 4 بايت.
كما نعلم ان نتيجة الضرب قد تفوق حجم 4 بايتات.. كل البتات فوق ال32 بت سوف تحذف.
اذا رحت استعمل النوع long long int الذي هو بحجم 64 بت.
طبعا هذا النوع يستوعب جميع نتائج الضرب لعددين من نوع int.
و لكن احترت في الكود.
الكود الاول خاطىء:
int a, b; //suppose that the multiplication of a and b gives a result that does not fit in 32bit type(int) long long int c = a *b;
الكود خاطىء لان الفيض (overflow) سيحصل اولا عند الضرب.. ثم القيمة الغير صحيحة سوف يتم تحويلها الى long long int و تعيينها الى المتغيّر c.
الكود الثاني و هو الكود الصحيح:
int a, b; //suppose that the multiplication of a and b gives a result that does not fit in 32bit type(int) long long int c = (long long int) (a * b);
و لكن لا اعلم لماذا الكود الاخير هو الصحيح..
انا ارى انّ:
1)سوف يتم ضرب a و b على اساس انهم 32 بت -> سوف نحصل على نتيجة فائضة (و خاطئة اذا)
2) ثم سوف يتم تحويل النتيجة الى 64 بت (الى long long int اعني) ثم سيتم تخزين النتيجة النهائية الى المتغيّر c.
اكيد فهمي خاطىء و اريد شرح كافي لتوضيح ماذا يحصل فعلا. و انا اظن ان المسالة لها علاقة بالAssociativity. يعني مثلا هل التحويل يتم اولا ام الضرب. و رغم ذلك لابد من توضيح.

