C语言结构体成员变量名后加冒号和数字的含义


C语言结构体成员变量名后加冒号和数字的含义

在阅读代码时,有时会看到定义结构体时,其成员变量会加上冒号和数字,如下图所示。

C语言结构体成员变量名后加冒号和数字的含义

其实,这是位域操作的表示方法,也就是说后面加上“:1”的意思是这个成员的大小占所定义类型的1 bit。通过sizeof运算法可以看出,结构体worker_t只占一个字节的空间。

sizeof 是一个判断数据类型或者表达式长度的运算符,以字节为单位。

如果把冒号和数字去掉,则可以看到,结构体worker_t占四个字节的空间,如下图所示。

C语言结构体成员变量名后加冒号和数字的含义

位域的概念

有些信息在存储时,并不需要占用一个完整的字节, 只需占一个或几个二进制位。例如一个开关量,只有0和1两种状态, 因此用一位二进位即可,这样可以节省存储空间。

所以就催生了“位域”结构,位域将1个字节划分成不同的区域,每个区域都有个位域名(也可以理解为变量名),通过位域名即可访问其中的数据。

struct 位域结构名

{

  类型说明符 位域名:位域长度;

  类型说明符 位域名:位域长度;

  ......

  类型说明符 位域名:位域长度;

};

在使用时需要注意以下几点:

  • 位域变量的长度不能大于其类型的长度 (sizeof(类型) * 8);
  • 不能用于位域字段的操作:取地址操作符&,位域是若干位空间,是没有地址的;
  • 位域可以是无名位域,无名位域只能用作填充或调整位置,不能使用。

扩展阅读

<stdint.h> 是 C99 中引进的一个标准 C 库的头文件,定义了几种扩展的整数类型和宏,如:/<stdint.h>

  • intN_t:表示长度为N位的整型数;
  • uintN_t:表示长度为N位的无符号整型数 。

其中 N 可以为 8,16,32,64。


分享到:


相關文章: