Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình C

Bit Field (Trường bit) trong C


Phần này giải thích bit field trong C.

Giả sử chương trình C chứa nhiều biến TRUE/FALSE gom trong cấu trúc status như sau:

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

Cấu trúc này cần 8 bit bộ nhớ nhưng thực tế chỉ lưu 0 hoặc 1 cho mỗi biến. C cung cấp cách tốt hơn để tận dụng bộ nhớ.

Nếu dùng biến như vậy trong cấu trúc, có thể định nghĩa độ rộng biến, báo cho trình biên dịch chỉ dùng số bit đó. Cấu trúc trên viết lại:

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

Cấu trúc này chỉ cần 4 bit cho biến status, nhưng chỉ dùng 2 bit để lưu giá trị.

Nếu dùng đến 32 biến mỗi biến 1 bit, cấu trúc status vẫn dùng 4 bit. Khi có 33 biến, nó cấp ô nhớ tiếp theo và dùng 8 bit. Xem ví dụ sau:

Ví dụ mã

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

/* cấu trúc đơn giản */
struct {
    unsigned int widthValidated;
    unsigned int heightValidated;
} status1;

/* cấu trúc với bit field */
struct {
    unsigned int widthValidated : 1;
    unsigned int heightValidated : 1;
} status2;

int main() {
    printf("Kích thước bộ nhớ status1: %d\n", sizeof(status1));
    printf("Kích thước bộ nhớ status2: %d\n", sizeof(status2));
    return 0;
}

Kết quả

Kích thước bộ nhớ status1: 8
Kích thước bộ nhớ status2: 4

Khai báo Bit Field

Khai báo bit-field trong cấu trúc có dạng:

struct {
    type [member_name] : width ;
};

Bảng mô tả các yếu tố bit field:

Yếu tốMô tả
typeKiểu nguyên xác định cách hiểu giá trị bit-field. Có thể là int, signed int, unsigned int.
member_nameTên bit-field.
widthSố bit trong bit-field. Phải nhỏ hơn hoặc bằng độ rộng bit của kiểu chỉ định.

Biến định nghĩa với độ rộng xác định gọi là bit field. Bit field có thể chứa nhiều hơn 1 bit; ví dụ cần biến lưu giá trị 0-7, định nghĩa bit field độ rộng 3 bit:

struct {
    unsigned int age : 3;
} Age;

Định nghĩa này báo cho trình biên dịch biến age chỉ dùng 3 bit. Nếu thử dùng quá 3 bit, trình biên dịch không cho phép. Thử ví dụ:

Ví dụ mã

#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;
}

Kết quả

Sizeof( Age ) : 4
Age.age : 4
Age.age : 7
Age.age : 0