位段

定义

为结构体或者联合体中, 如果某一成员指定了存储的宽度, 这种技术被称为位段, 声明的类型和指定的宽度, 共同决定该位段的数据表示范围
可参考:

  1. Bit fields
  2. 位段

特点

  1. 可以声明char, short, int, long, 可以有符号,也可以无符号
  2. 结构体的内存布局, 会根据数据类型的不同有对齐. 以结构体中最长的数据类型(声明的数据类型, 并非位段的宽度)的整数倍来对齐, 因此结构体的大小一定是最长数据类型的整数倍(PS: 不同的操作系统和编译器, 对齐方式可能会有差别)
  3. 可以声明匿名成员, 如: struct A { unsigned char a:4; unsigned char :4}; , 仅表示占用几位; 如果匿名成员的长度表示为0, 则表示下一个成员的起始地址为下一个对齐单元的地址
  4. 位段不可以取地址, 获取地址偏移, 因为位段可能在字节内部, 无法表示其内存地址, 也不可以获取其引用
  5. 相邻且相同类型的位段, 如果没有超出其声明类型的宽度, 则这些位段将被放置在一个声明类型中

用途

  1. 典型应用于网络协议中表示数据包的格式
  2. 其他需要节省内存空间, 在一个基本类型中要表示多个成员的场景

位段的大小端问题

例子

在linux上/usr/include/netinet/ip.h中定义的iphdr的结构体中, version和header_len定义的顺序不同

参见

  1. http://blog.leanote.com/post/804305986@qq.com/%E4%BD%8D%E5%9F%9F
  2. http://www.cnblogs.com/chencheng/archive/2012/06/19/2554081.html
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值