Bit Fields ฟิลด์บิต ภาษา C
สมมติว่าโปรแกรม 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 ;
};
ตารางต่อไปนี้อธิบายองค์ประกอบตัวแปรของฟิลด์บิต −
| Sr.No. | Element & Description |
|---|---|
| 1 | type ชนิดข้อมูลจำนวนเต็มที่กำหนดวิธีตีความค่าของบิตฟิลด์ ชนิดข้อมูลอาจเป็น int, signed int, หรือ unsigned int. |
| 2 | member_name ชื่อของบิตฟิลด์ |
| 3 | width จำนวนบิตในฟิลด์บิต ความกว้างต้องน้อยกว่าหรือเท่ากับความกว้างบิตของประเภทที่ระบุ |
ตัวแปรที่กำหนดไว้ล่วงหน้ากับความกว้างที่เรียกว่าเขตบิตฟิลด์บิตสามารถเก็บได้มากกว่าหนึ่งบิต ตัวอย่างเช่น หากคุณต้องการตัวแปรในการจัดเก็บค่าตั้งแต่ 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