تم وضع السؤال هنا لأن الإجابه مرحب بها بأى لغه كانت.
عندما اقوم بكتابة كود كالتالي:
short i = 65535;
يقوم المترجم بمعرفة ان i هو identifier و الرقم 65535 هو قيمة literal من نوع int - و ذلك لعدم وجود suffix - و يقوم بإجراء تحويل للرقم من صورته النصيه للنسخه الرقميه منه، بعدها يقوم بمقارنه هذا الرقم بالمدى الخاص بالنوع short فيجد ان الرقم اكبر من القيمه الكبرى المسموح بها فيقوم الـ Parser بعمل truncate للقيمه و يصدر التحذير: initializing : truncation of constant value.
حتى الأن لا توجد مشكله معي، المشكله تبدأ مع كود مثل التالي:
short i = 18446744073709551619;
الرقم المذكور بالأعلي يتعدي أكبر عدد مسموح به لنوع رقم صحيح بالغه C++/C لذا يقوم المترجم بإصدار الخطاء constant too big.
السؤال هو:
1 - ما نوع المساحه التى يستخدمها المترجم ليقوم فيها يتحويل الرقم من صورته النصيه إلى صورته الرقميه.
2 - إذا كانت المساحه محدوده - مثلا المترجم يستخدم النوع uint64 - فكيف يستطيع المترجم ان يحدد ان الصوره النصيه للرقم تماثل الصوره الرقميه التى قام بتحويلها حيث حينها من الممكن ان يحدث overflow بالنوع المستخدم - مع العلم ان هذا لا يحدث و الدليل على ذلك ان المترجم يصدر الخطأ بأن الرقم كبير جدا و هذا يعنى انه تعرف على الرقم فى صورته الرقميه.
قمت بوضع هذا السؤال بموقع stack overflow و الإجابه الوحيده المقنعه التى حصلت عليها تفيد بإستخدام BigNum لحل هذا الأمر.
قمت بمراجعة اكواد المترجمات التاليه عسي ان اصل لنتيجه و لكني لم أصل للكود المطلوب بعد - إن كنت تعرف ارجو اخباري:
LLC 4.2 GCC 4.2.0 Open Watcom 1.9.0 Root 5.28.0 vbcc Tiny C 0.9.25 CLang Mono C# Mono Basic Blue C# Microsoft Shared Source C# Compiler FreeBASIC KBasic SmallBasic
أأمل إن كنت تعرف إجابة السؤال ان تخربني بها، أو يمكنك ترك مرجع للكود داخل كود اى من المترجمات السابقه او إن كان لديك كود بأى لغه فمرحب به.
و الله ولي التوفيق