C语言之位域的概念和用法

15 篇文章 0 订阅
8 篇文章 0 订阅

先来个位域申明:

struct{
	type [member_name] : width ;
}
元素描述
type整数类型,决定了如何解释位域的值。类型可以是整型、有符号整型、无符号整型。
member_name位域的名称。
width位域中位的数量。宽度必须小于或等于指定类型的位宽度。

带有预定义宽度的变量被称为位域。位域可以存储多于 1 位的数,例如,需要一个变量来存储从 0 到 7 的值,您可以定义一个宽度为 3 位的位域,

存储从0到7的值需要3位的位域
0到3需要2位
0到1需要1位

如下:

struct
{
  unsigned int age : 3;		//存储0到7的数值
} Age;

此处贴的位域测试代码为网上看到,仅供参考

// 位域内存测试
#include <stdio.h>
struct ONE_BYTE
{
    unsigned char _bool : 1;
    unsigned char del_flag : 1;
    unsigned char status : 4;
} one_byte;

struct TWO_BYTE
{
    unsigned char ccc1 : 4;
    unsigned char ccc2 : 4;
    unsigned char ccc3 : 4;
    unsigned char ccc4 : 4;
} two_byte;

struct THREE_BYTE
{
    unsigned char ccc1 : 4;
    unsigned char ccc2 : 4;
    unsigned char ccc3 : 4;
    unsigned char ccc4 : 4;
    unsigned char ccc5 : 4;
} three_byte;

struct FOUR_BYTE
{
    unsigned int ccc1 : 16;
    unsigned int ccc2 : 16;
} four_byte;


struct EIGHT_BYTE
{
    unsigned char ccc1 : 1;
    unsigned int ccc2 : 1;
} eight_byte;

int main(int argc, char const *argv[])
{
    printf("sizeof one_byte is : %lu\n", sizeof(one_byte));
    printf("sizeof two_byte is : %lu\n", sizeof(two_byte));
    printf("sizeof three_byte is : %lu\n", sizeof(three_byte));
    printf("sizeof four_byte is : %lu\n", sizeof(four_byte));
    printf("sizeof eight_byte is : %lu\n", sizeof(eight_byte));
    return 0;
}

输出结果为:

sizeof one_byte is : 1B
sizeof two_byte is : 2B
sizeof three_byte is : 3B
sizeof four_byte is : 4B
sizeof eight_byte is : 4B

下图为本人亲自在Linux环境下运行后的结果,与上面结果一致
运行程序
结果

总结:

(1)结构体内存分配原则:
原则一:结构体中元素按照定义顺序存放到内存中,但并不是紧密排列。从结构体存储的首地址开始 ,每一个元素存入内存中时,它都会认为内存是以自己的宽度来划分空间的,因此元素存放的位置一定会在自己大小的整数倍上开始。

原则二: 在原则一的基础上,检查计算出的存储单元是否为所有元素中最宽的元素长度的整数倍。若是,则结束;否则,将其补齐为它的整数倍。

(2)定义位域时,各个成员的类型最好保持一致,比如都用char,或都用int,不要混合使用,这样才能达到节省内存空间的目的。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中的位域(bit-field)是一种数据结构,用于将一个整型数据类型拆分成多个不同的位来存储不同的信息。位域可以用于节省内存空间,提高程序性能,或者定义一些特殊的数据类型。 位域通常与结构体一起使用,结构体中的每个成员可以使用不同的位域来表示不同的信息。定义一个位域的语法格式如下: ``` struct { type [member_name] : width; }; ``` 其中,type 表示位域的数据类型,member_name 表示成员的名称,width 表示该成员占用的位数。 以下是一个例子: ``` #include <stdio.h> struct { unsigned int age : 3; unsigned int sex : 1; } person; int main() { person.age = 5; person.sex = 1; printf("person.age: %d\n", person.age); printf("person.sex: %d\n", person.sex); return 0; } ``` 在这个例子中,我们定义了一个名为 person 的结构体,其中包含两个位域成员 age 和 sex。age 占用 3 位,sex 占用 1 位。 在主函数中,我们为 person 的 age 和 sex 成员分别赋值,然后使用 printf 函数输出这两个成员的值。输出结果为: ``` person.age: 5 person.sex: 1 ``` 由于 age 只占用了 3 位,所以它的取值范围为 0 到 7。sex 只占用了 1 位,所以它的取值范围为 0 或 1。 需要注意的是,位域的使用可能会受到机器硬件的限制,不同的编译器可能会对位域的实现方式有所不同。因此,在使用位域时需要谨慎考虑其可移植性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值