Trong phần này, chúng ta sẽ tìm hiểu các trường bit trong C.
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à trạng thái, như sau -
struct { unsigned int widthValidated; unsigned int heightValidated; } status;
Cấu trúc này yêu cầu 8 bit 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 những 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 độ rộng của một biến để cho trình biên dịch C biết rằng bạn sẽ chỉ sử dụng số bit đó. 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 yêu cầu 4 bit không gian bộ nhớ cho biến trạng thái, nhưng chỉ 2 bit sẽ được sử dụng để lưu trữ các giá trị.
Nếu bạn sẽ sử dụng tối đa 32 biến, mỗi biến có độ rộng là 1 bit, thì cấu trúc trạng thái cũng sẽ sử dụng 4 bit. Tuy nhiên, ngay sau khi bạn có 33 biến, nó sẽ cấp phát khe tiếp theo của bộ nhớ và nó sẽ bắt đầu sử dụng 8 bit. Hãy để chúng tôi kiểm tra ví dụ sau để hiểu khái niệm -
Mã mẫu
#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; }
Đầu ra
Memory size occupied by status1 : 8 Memory size occupied by status2 : 4
Khai báo trường bit:
Khai báo trường bit có dạng sau bên trong cấu trúc -
struct { type [member_name] : width ; };
Bảng sau đây mô tả các phần tử biến của trường bit -
Phần tử | Mô tả |
---|---|
loại | Một kiểu số nguyên xác định cách diễn giải giá trị của trường bit. Kiểu có thể là int, int có dấu hoặc int không dấu. |
member_name | Tên của trường bit. |
chiều rộng | Số lượng bit trong trường bit. Chiều rộng phải nhỏ hơn hoặc bằng chiều rộng bit của loại được chỉ định. |
Các biến được xác định với độ rộng xác định trước được gọi là trường bit. Một trường bit có thể chứa nhiều hơn một bit đơn lẻ; ví dụ:nếu bạn cần một biến để lưu trữ giá trị từ 0 đến 7, thì bạn có thể xác định một trường bit có độ rộng 3 bit như sau -
struct { unsigned int age : 3; } Age;
Định nghĩa cấu trúc trên hướng dẫn 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. Hãy để chúng tôi thử ví dụ sau -
Mã mẫu
#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; }
Đầu ra
Sizeof( Age ) : 4 Age.age : 4 Age.age : 7 Age.age : 0