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

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

بدأه m1m6 في 21 نوفمبر 2013 · 6 رد · 616 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

 

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

 

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

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

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

ولو كان بت 

 

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

 

unsigned mintissa:88;   ???

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 21 نوفمبر 2013 في 19:37

#2

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

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

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

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

بالتوفيق

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 21 نوفمبر 2013 في 20:02

#3
اقتباس
و لكنه سيحجز 88/8 أي 11 بايت

 

 

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

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

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

 

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

unsigned mintissa : 87

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

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

 

 

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

#4
اقتباس

المطلوب مني اعملو 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

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

#5

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

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

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

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

#6

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

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

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

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

وهكذا ...

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

اقتباس

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

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

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

بالتوفيق

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 21 نوفمبر 2013 في 22:22

#7

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

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