الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيف يقارن المترجم القيم الرقميه

بدأه C++er في 9 يونيو 2011 · 4 رد · 632 مشاهدة · في هندسة البرمجيات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

تم وضع السؤال هنا لأن الإجابه مرحب بها بأى لغه كانت.

عندما اقوم بكتابة كود كالتالي:

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

أأمل إن كنت تعرف إجابة السؤال ان تخربني بها، أو يمكنك ترك مرجع للكود داخل كود اى من المترجمات السابقه او إن كان لديك كود بأى لغه فمرحب به.

و الله ولي التوفيق

مدونتي: C++ Tips and Tricks

#2

↑ UP ↑

تم تعديل هذه المشاركة بواسطة محمد علاء الدين في 10 يونيو 2011 في 20:46

مدونتي: C++ Tips and Tricks

#3

الحمد لله وجدت حل منطقي داخل الـ preprocessor الخاص بالمترجم vbcc، إن كنت مهتم يمكنك مراجعة الملف eval.c.

و الله ولي التوفيق

تم تعديل هذه المشاركة بواسطة محمد علاء الدين في 11 يونيو 2011 في 20:35

مدونتي: C++ Tips and Tricks

#4

حبذا لو أفدتنا أخي.

#5

للأرقام الصحيحه يتم إستخدام مساحه مضاعفه لأكبر نوع رقمي لديه و من خلاله يستطيع التحقق من حدوث overflow.

للأرقام العشريه يتم التحقق من قيمة الـ Exponent تبعا لأكبر و اصغر قيمه و كذلك يتم التحقق من الـ precision و الـ integer part.

و الله ولي التوفيق

1

مدونتي: C++ Tips and Tricks

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…