Test Footer 2

C Tutorial Part 19 - Bit Fields


Giả sử chương trình C của bạn có chứa một số TRUE / FALSE biến nhóm lại trong một cấu trúc được gọi là trạng thái, như sau:
struct này đòi hỏi phải có 8 byte của không gian bộ nhớ nhưng trong thực tế chúng ta chỉ dùng 8 byte này để lưu trữ là 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 để tận dụng không gian bộ nhớ trong tình trạng này để không lãng phí bộ nhớ. Nếu bạn đang sử dụng các biến như bên trong một struct sau đó bạn có thể xác định chiều rộng của một biến mà nói với các trình biên dịch C mà bạn đang sử dụng chỉ những số byte. Ví dụ, cấu trúc trên có thể được viết lại như sau:
Bây giờ, struct trên sẽ yêu cầu 4 byte của không gian bộ nhớ cho tình trạng biến nhưng chỉ có 2 bit sẽ được sử dụng để lưu trữ các giá trị. Hãy cùng xem qua ví dụ sau bạn sẽ hiểu :
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra các kết quả sau đây:

Khai Báo Bit Field

Cách khai báo như sau :
Dưới đây mô tả yếu tố của các biến trong môi trường Bit Field


Các biến được định nghĩa với một độ rộng xác định trước được gọi là các lĩnh vực bit. Một trường bit có thể chứa nhiều hơn một chút, ví dụ nếu bạn cần một biến để lưu trữ một giá trị 0-7 chỉ sau đó bạn có thể định nghĩa một lĩnh vực bit có chiều rộng 3 bit như sau:
struct
{
unsigned int age : 3;
} Age;
Định nghĩa cấu trúc trên chỉ thị biên dịch C là biến age sẽ chỉ sử dụng 3 bit để lưu trữ các giá trị, nếu bạn sẽ 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 đây:
#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;
}
Khi đoạn mã trên được biên dịch nó sẽ biên dịch với cảnh báo và khi thực hiện, nó tạo ra các kết quả sau:
Sizeof( Age ) : 4
Age.age : 4
Age.age : 7
Age.age : 0

Share on Google Plus

About Unknown

0 nhận xét:

Đăng nhận xét