• 0
m1m6

[ تمت الإجابة ]سؤال عن استخدام bit field

سؤال

السلام عليكم

 

بدي اعمل نوع بيانات جديد واسمه  longDouble   مثلا

 

المطلوب هو استخدام 16 بايت لتمثيل الارقام 

struct my_float{unsigned mantissa:11;int exponent:4;unsigned sign:1;};

هل حجم الـــ mintissa  11 بايت ام 11 بت ؟؟؟

ولو كان بت 

 

بقدر اعمل التالي :

 

unsigned mintissa:88;   ???

تم تعديل بواسطه مصطفى 36a2
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

6 إجابة على هذا السؤال .

  • 0

نعم الطريقة التي استخدمتها تحدد عدد "البت" للجزء المخصص ..وبخصوص الشق الثاني من سؤالك .. أنت عرفت المتحول كـunsigned  أي أنه int

ولا يمكن وضع 88 بت داخل int  ... حتى لو قبل منك المترجم هذه العبارة فسيتعامل معه كـ int و لكنه سيحجز 88/8 أي 11 بايت ويقرّبها إلى مضاعفات الأربعة ( حسب خصائص معينة ) إلى 12

الخلاصة : لا يمكنك إسناد عدد بتات أكبر مما تتيحه الأنواع الموجودة .

إن لم يوضح الجواب تابع سؤالك ..

بالتوفيق

تم تعديل بواسطه مصطفى 36a2
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
و لكنه سيحجز 88/8 أي 11 بايت

 

 

المطلوب مني اعملو 16 بايت 

بحيث اول بت للاشارة والباقي يتم تقسيمه بين الرقم العشري والرقم اللي بعد الفاصلة 

والرقم العشري نوعه int  يعني افتراضي راح يحجز 4 بايت 

 

راح من الــ 16 بايت هو 87 بت  حسب كلامك  بقدر اضيف الكود التالي 

unsigned mintissa : 87  

وبالتالي راح يقسمها ويقرب لاقرب عدد حسب ما قلت انت ...

كلامي مزبوط ولا لا .

 

 

حسب كلامك لو وضعت 

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

المطلوب مني اعملو 16 بايت 

بحيث اول بت للاشارة والباقي يتم تقسيمه بين الرقم العشري والرقم اللي بعد الفاصلة 

والرقم العشري نوعه int  يعني افتراضي راح يحجز 4 بايت

 

إذا كان يخضع لـ IEEE 754 standard المفترض أن يكون كالتالي:

struct my_float{	unsigned short mantissa[7];	  signed short exponent:15;	unsigned short sign:1;};

حيث mantissa بمساحة 112 بت و الـ exponent بمساحة 15 بت و الإشارة بمساحة 1 بت.

 

 

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

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

مشكور اخوي , ولكن صراحة ما بعرف الــ IEEE 754 standard  ولا قريت عنه , مع انو الاستاذ طلب منا ندرس هاد الموضوع بس طنشتو :)

المهم انا جربطت التالي :

struct my_float{	unsigned mantissa : 87  ;	  signed short exponent:15;	unsigned short sign:1;}xx;

واشتغل معي عادي.... لكن بحسب خبرتك فيه مشكلة من ناحية المنطق ولا لا ؟؟ لانو مش شرط اذا اشتغل على الكومبايلر يكون من ناحية منطقية صحيح....

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

التقسيم والتقريب يكون لحجم الـstruct الكلي وليس لكل عنصر على حدة ..

على كل حال .. الكود يعمل عندك , ولكنه لن يعمل عند الجميع فهو كما ذكر الأخ C++er لا يحقق معايير اللغة ..

من الآخر : إذا كنت تريد حجز 100 بايت .. ماذا ستفعل .؟ مصفوفة من char فيها 100 عنصر ..!

تريد حجز 128 بت .. (يعني 16 بايت ) ولديك النوع int  وبفرض أنه لديك يأخذ بايت .. فستحتاج مصفوفة من 4 عناصر نوعها int

وهكذا ...

المهم ألا تتحاوز حجم النوع المستخدم ..


لكن بحسب خبرتك فيه مشكلة من ناحية المنطق ولا لا ؟؟ لانو مش شرط اذا اشتغل على الكومبايلر يكون من ناحية منطقية صحيح....

المشكلة ليست في المنطق .. المشكلة أنك خرجت عن قواعد اللغة .. (حتى لو قبلها المصرف )

اتبع ما قاله الأخ C++er أو اقرأ في الـ Standard فالأمر  سيان ..

بالتوفيق

تم تعديل بواسطه مصطفى 36a2
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

تمام اخي الان فهمت 
بارك الله فيكم ::)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .