简要分析C中结构的位域成员

    C/C++提供了一个内嵌的特征来访问字节中的为,即位域。位域很有用,因为:

    1)如果存储空间受限,可以在一个字节中存储多个布尔变量(真/假)。
    2)某些设备传输被编码为一个字节中的为的状态信息。
    3) 某些加密程序需要访问字节中的位。

    C/C++使用基于结构的方法来访问位。事实上,位域是结构成员的特殊类型,它以位(bit)为单位定义域的长度。

    位域定义的一般形式如下(C++风格)

    struct struct-type-name
    {
       type name1:length;
       type name2:length;
       ....
       type nameN:length;
    } variable_list;

    type是位域的类型,应该是_Bool(C99)、char、int和枚举等整型类型。
    length是位域的长度,要求是非负整型常量或表达式,并且值不能大于type所对应的位宽度。例如,char bit_field:9是无法通过编译的。
    另外,长度为1的位域应该声明为unsigned,因为单个位不能有符号。

    给位域赋值与给其他任何类型的结构成员赋值一样。

    位域并不一定要命名,这样可以跳过无用位,方便的使用希望的位。

    位域变量的使用有一些限制:

       1).不能使用位域变量的地址。
       2).位域变量不能构成数组。
       3).位域变量不能声明为静态的。
   
    特别的,位域的使用与机器的比特序有关。

    关于比特序和字节序之间的区别和联系,可以参考下文:
    http://www.linuxjournal.com/article/6788

    我的blog上有该文的翻译版,不过本人乃业余翻译者,不对翻译内容和质量作任何承诺和保证。
    http://blog.csdn.net/lovekatherine/archive/2007/04/14/1564731.aspx


后文重点分析位域与比特序的关系,以下面的小程序为例。



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

typedef 
struct _bitdomain

{    

    unsigned 
char a:3;
    unsigned 
char b:5;

}
 X;


void display (char dst)
{
   
   
int i;
   unsigned 
int m=128;

   
while(m)
   
{
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言的共用体(Union)和位域(Bit-Field)是用来优化内存使用和灵活操作数据的工具。 共用体是一种特殊的数据类型,它允许不同的变量共享同一块内存空间。共用体成员变量共享同一内存,占用内存大小等于最大成员的大小。通过修改共用体的一个成员变量的值,可以影响到其他成员变量的值。共用体适用于在不同的数据类型之间进行转换或者存储占用内存大小不定的数据。 位域是一种特殊的结构成员变量,可以指定成员变量占用的位数,从而实现对内存空间的灵活利用。位域成员变量必须是整型数据类型,并且位域的大小不能超过该整型类型的大小。位域可以用于减小数据结构占用的内存大小,以及进行数据的位操作。 共用体和位域结构体可以一起使用。通过在位域结构定义共用体成员变量,可以实现对内存的灵活使用和数据的高效操作。共用体可以用于存储不同类型的数据,而位域可以用于压缩数据的存储空间。这种结合使用的方式可以为我们的程序带来更加高效和节省内存的特点。 总结起来,C语言的共用体和位域结构体提供了一种优化内存使用和操作数据的方式。它们可以灵活地对内存空间进行利用,并且能够高效地操作数据。通过合理的使用共用体和位域结构体,我们可以达到节省内存和提高程序执行效率的目的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值