Trường Bit trong C là các biến được định nghĩa với chiều rộng được xác định trước, một trường bit có thể chứa nhiều hơn một bit.
Giả sử chương trình C của bạn chứa một số biến TRUE / FALSE được nhóm trong một cấu trúc được gọi là status, như sau:
struct {
unsigned int widthValidated;
unsigned int heightValidated;
} status;
Cấu trúc này yêu cầu 8 byte không gian bộ nhớ nhưng trên thực tế, chúng ta sẽ lưu trữ 0 hoặc 1 trong mỗi biến. Ngôn ngữ lập trình C cung cấp một cách tốt hơn để sử dụng không gian bộ nhớ trong các tình huống như vậy.
Nếu bạn đang sử dụng các biến như vậy bên trong một cấu trúc thì bạn có thể xác định chiều rộng của một biến cho trình biên dịch C rằng bạn sẽ chỉ sử dụng số byte đó. Ví dụ, cấu trúc trên có thể được viết lại như sau:
struct {
unsigned int widthValidated : 1;
unsigned int heightValidated : 1;
} status;
Cấu trúc trên đòi hỏi 4 byte không gian bộ nhớ cho biến status, nhưng chỉ 2 bit được sử dụng để lưu trữ các giá trị.
Nếu bạn sử dụng tối đa 32 biến, mỗi biến có chiều rộng là 1 bit, thì cấu trúc trạng thái sẽ sử dụng 4 byte. Tuy nhiên ngay sau khi bạn có 33 biến, nó sẽ phân bổ tiếp theo của bộ nhớ và nó sẽ bắt đầu sử dụng 8 byte. Hãy để chúng tôi kiểm tra ví dụ sau:
#include
#include
/* 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;
}
Khi mã trên được biên dịch và thực hiện, nó tạo ra kết quả sau:
Memory size occupied by status1 : 8
Memory size occupied by status2 : 4
Việc khai báo một trường bit bên trong một cấu trúc:
struct {
type [member_name] : width ;
};
Bảng sau mô tả các phần tử biến của trường bit:
STT |
Mô tả |
1 |
Type: Một kiểu integer có thể xác định cách trường Bit được thông dịch. Kiểu này có thể là int, signed int, unsigned int |
2 |
member_name: Tên của Trường Bit. |
3 |
Width: (là độ rộng) Số lượng bit có trong một trường. Độ dài phải nhỏ hơn hoặc bằng độ dài Trường Bit của một đối tượng cụ thể. |
Các biến được định nghĩa với chiều rộng được xác định trước được gọi là các trường bit. Một trường bit có thể chứa nhiều hơn một bit, ví dụ, nếu bạn cần một biến để lưu trữ một giá trị từ 0 đến 7, thì bạn có thể định nghĩa một trường bit với độ rộng là 3 bit như sau:
struct {
unsigned int age : 3;
} Age;
Định nghĩa cấu trúc trên chỉ thị cho trình biên dịch C rằng biến age sẽ chỉ sử dụng 3 bit để lưu trữ giá trị. Nếu bạn cố gắng sử dụng nhiều hơn 3 bit, thì nó sẽ không cho phép bạn làm như vậy. Chúng ta hãy thử ví dụ sau:
#include
#include
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;
}
Khi mã trên được biên dịch, nó sẽ biên dịch với một cảnh báo và khi được thực thi, nó tạo ra kết quả sau:
Sizeof( Age ) : 4
Age.age : 4
Age.age : 7
Age.age : 0