القائمة الرئيسية

الصفحات

C - Bit Fields / الحقول

 افترض أن برنامج C الخاص بك يحتوي على عدد من المتغيرات TRUE / FALSE مجمعة في بنية تسمى الحالة ، على النحو التالي -

struct {
   unsigned int widthValidated;
   unsigned int heightValidated;
} status;

تتطلب هذه البنية 8 بايت من مساحة الذاكرة ولكن في الواقع ، سنقوم بتخزين 0 أو 1 في كل من المتغيرات. توفر لغة البرمجة C طريقة أفضل للاستفادة من مساحة الذاكرة في مثل هذه المواقف.

إذا كنت تستخدم مثل هذه المتغيرات داخل بنية ، فيمكنك تحديد عرض المتغير الذي يخبر مترجم C أنك ستستخدم هذا العدد من البايتات فقط. على سبيل المثال ، يمكن إعادة كتابة الهيكل أعلاه على النحو التالي -

struct {
   unsigned int widthValidated : 1;
   unsigned int heightValidated : 1;
} status;

تتطلب البنية أعلاه 4 بايت من مساحة الذاكرة لمتغير الحالة ، ولكن سيتم استخدام 2 بت فقط لتخزين القيم.

إذا كنت ستستخدم ما يصل إلى 32 متغيرًا كل واحد بعرض 1 بت ، فستستخدم بنية الحالة أيضًا 4 بايت. ومع ذلك ، بمجرد أن يكون لديك 33 متغيرًا ، فسوف تخصص الفتحة التالية من الذاكرة وستبدأ باستخدام 8 بايت. دعونا نتحقق من المثال التالي لفهم المفهوم -


#include <stdio.h>
#include <string.h>

/* define simple structure */
struct {
   unsigned int widthValidated;
   unsigned int heightValidated;
} status1;

/* define a structure with bit fields */
struct {
   unsigned int widthValidated : 1;
   unsigned int heightValidated : 1;
} status2;
 
int main( ) {
   printf( "Memory size occupied by status1 : %d\n", sizeof(status1));
   printf( "Memory size occupied by status2 : %d\n", sizeof(status2));
   return 0;
}

عندما يتم تجميع التعليمات البرمجية أعلاه وتنفيذها ، فإنها تنتج النتيجة التالية -

Memory size occupied by status1 : 8
Memory size occupied by status2 : 4

إعلان حقل بت

يحتوي إعلان حقل البت على الشكل التالي داخل بنية -

struct {
   type [member_name] : width ;
};

يصف الجدول التالي العناصر المتغيرة لحقل بت -

الأب رقم.العنصر والوصف
1

نوع

نوع عدد صحيح يحدد كيفية تفسير قيمة حقل البت. قد يكون النوع عدد صحيح أو عدد صحيح أو عدد صحيح بدون توقيع.

2

اسم عضو

اسم حقل البت.

3

عرض

عدد البتات في حقل البت. يجب أن يكون العرض أقل من عرض البت للنوع المحدد أو مساويًا له.

المتغيرات المعرفة بعرض محدد مسبقا تسمى حقول بت . يمكن أن يحتوي حقل البت على أكثر من بت واحد ؛ على سبيل المثال ، إذا كنت بحاجة إلى متغير لتخزين قيمة من 0 إلى 7 ، فيمكنك تحديد حقل بت بعرض 3 بتات على النحو التالي -

struct {
   unsigned int age : 3;
} Age;

يوجه تعريف البنية أعلاه مترجم C إلى أن متغير العمر سيستخدم 3 بتات فقط لتخزين القيمة. إذا حاولت استخدام أكثر من 3 بتات ، فلن تسمح لك بذلك. دعونا نجرب المثال التالي -


#include <stdio.h>
#include <string.h>

struct {
   unsigned int age : 3;
} Age;

int main( ) {

   Age.age = 4;
   printf( "Sizeof( Age ) : %d\n", sizeof(Age) );
   printf( "Age.age : %d\n", Age.age );

   Age.age = 7;
   printf( "Age.age : %d\n", Age.age );

   Age.age = 8;
   printf( "Age.age : %d\n", Age.age );

   return 0;
}

عندما يتم تجميع الكود أعلاه ، سيتم تجميعه مع تحذير وعندما يتم تنفيذه ، فإنه ينتج النتيجة التالية -

Sizeof( Age ) : 4
Age.age : 4
Age.age : 7
Age.age : 0
هل اعجبك الموضوع :

تعليقات