关于C语言中的位域问题

C中的位域
在数据存储时,有的时候我们不需要一个完整的字节来存储数据,只需要其中的一个或几个二进制位就可以完整的表达,特别是在嵌入式设备中,对内存中的管理尤其严格,因为在嵌入式设备中,内存是有限的,因此,需要程序员对内存进行严格管理,C语言中为了节省存储空间,提供了一种数据结构,即“位域” 或”位段“。
位域的定义与结构体的定义一样
如:

struct bit_fields{
    int a:2;
    int b:6;
    int  :0;
    int d:5;
    int e:4;
    int f:3;
    int g:5;   
}data,*p_data;

注意:
1. 位域必须存储在同一个类型中,不能跨类型存储,也不能跨字节存储。如果一个字节余下的空间不够存储另外一个位域时,则应该从下一单元存放该位域
2. 位域的长度不能超过所定义的类型的长度
3. 如果位域是无名位域,且用来作为填充和调整的位置,则该位域不能被使用
4. 如果位域的长度为0,则表示该位域是空域,同时,下一个域则会从下一个字节单元开始存放
5. 取地址操作符&不能应用在位域字段上
6. 位域赋值时注意不要超过位域表示的范围

如:

#include<stdio.h>

struct bit_fields{
    int a:2;
    int b:6;
    int d:5;
    int  :0;    //无名空域,不能使用,从下一个字节单元开始
    int e:4;
    int f:3;
    int g:5;
}data,*p_data;
int main()
{
    data.a = 1;   //表示范围为-2~1,注意赋值时不超过其范围
    data.b = 31;
    data.d = 5;
    data.e = 5;
    data.f = 3;
    data.g = -8;
    printf("data.a = %d  data.b = %d  data.d = %d  data.e = %d  data.f = %d  data.g = %d \n",data.a,data.b,data.d,data.e,data.f,data.g);
    p_data = &data;
    printf("p_data = %p \n",&p_data);
    printf("sizeof(data) = %ld\n",sizeof(data));  //位域大小
    printf("sizeof(int) = %ld\n",sizeof(int));
    printf("p_data->a = %d \n",p_data->a);
    //printf("p_data->a = %p \n",&p_data->a);  //不能对位域字段取地址操作
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值