位字段

作者: tarzipc | 来源:发表于2017-04-09 18:58 被阅读0次

位字段由一个结构体声明建立,通过用signed int 或 unsigned int 中的一组相邻的位表示。
这里假定int = 4字节,事实上大部分也是4字节--

按4字节对齐的话
struct {                //unsigned int = 4byes = 0000 0000 x 4
    unsigned aut:1;     // = 1;;0000 0000 0000 0000 0000 0000 0000 0001
    unsigned bld:1;     // = 1;;0000 0000 0000 0000 0000 0000 0000 0010
    unsigned und:1;     // = 1;;0000 0000 0000 0000 0000 0000 0000 0100
} duct;
sizeof(duct) = 4

通过pragma 改变对齐字节,高位没有用到的字节被截断
#pragma pack(2)
struct {                //unsigned int = 4byes = 0000 0000 x 4
    unsigned aut:1;     // = 1;; 0000 0000 0000 0001
    unsigned bld:1;     // = 1;; 0000 0000 0000 0010
    unsigned und:1;     // = 1;; 0000 0000 0000 0100
} duct;
#pragma pack()
sizeof(duct) = 2

#pragma pack(1)
struct {                //unsigned int = 4byes = 0000 0000 x 4
    unsigned aut:1;     // = 1;; 0000 0001
    unsigned bld:1;     // = 1;; 0000 0010
    unsigned und:1;     // = 1;; 0000 0100
} duct;
#pragma pack()
sizeof(duct) = 1

匿名字段
可以通过匿名字段填充位


#pragma pack(2)
struct {                //unsigned int = 4byes = 0000 0000 x 4
    unsigned aut:1;     // = 1;; 0000 0000 0000 0001
    unsigned    :2;     //           下一个位将从(↓)4开始
    unsigned bld:1;     // = 1;; 0000 0000 0000 1000
    unsigned und:1;     // = 1;; 0000 0000 0001 0000
} duct;
#pragma pack()
sizeof(duct) = 2

另外将匿名字段宽度设置为0,将会强制下一个字段与一个整数对齐
#pragma pack(2)
struct {                //unsigned int = 4byes = 0000 0000 x 4
    unsigned aut:1;     // = 1;; 0000 0000 0000 0000  0000 0000 0000 0000 0000 0000 0000 0001
    unsigned    :0;     //              下一个位将从(↓)33开始
    unsigned bld:1;     // = 1;; 0000 0000 0000 0001  0000 0000 0000 0000 0000 0000 0000 0000
    unsigned und:1;     // = 1;; 0000 0000 0000 0010  0000 0000 0000 0000 0000 0000 0000 0000
} duct;
#pragma pack()
sizeof(duct) = 6

若剩下的位数不足以放下下一个字段要求的位宽度,将会自动补齐,如以下例子中all要求15位,而剩下的仅13位
#pragma pack(2)
struct {                //unsigned int = 4byes = 0000 0000 x 4
    unsigned aut:1;     // = 1;;0000 0000 0000 0000 0000 0000 0000 0001
    unsigned bld:1;     // = 1;;0000 0000 0000 0000 0000 0000 0000 0010
    unsigned und:1;     // = 1;;0000 0000 0000 0000 0000 0000 0000 0100
                        //                     从(↓)结束         从(↓)开始
    unsigned all:15;    // = 1;;0000 0000 0000 0000 0000 0000 0000 1000
                                └────填充的位──────┘
} duct;
#pragma pack()
sizeof(duct) = 4;

以上这些是在windows cygwin clion 的实验下的结果,位字段有很强的机器依赖性,对于边界对齐或位顺序往往不一致。因此导致难以移植。

相关文章

  • 位字段

    位字段 - 限定结构体某个变量使用固定的二进制位 节约内存,例如嵌入式物联网设备开发 一般情况下, struc...

  • 位字段

    位字段由一个结构体声明建立,通过用signed int 或 unsigned int 中的一组相邻的位表示。这里假...

  • ICMP协议

    报文格式8位类型、8位代码、16位校验和,其余字段根据类型各不相同;不同类型由类型字段和代码字段共同决定,大体又可...

  • mongodb更新运算符

    字段 数组 修饰符 按位

  • 6.9位字段

    在存储空间非常宝贵的情况下,有可能需要将多个对象保存在一个机器字中.一种常用的方法是,使用类似于编译器符号表的单个...

  • 使用‘位’设计权限字段

    程序设计的过程中,有时需要用若干属性来表示对某个资源的访问控制。比如,Linux中文件的可读、可写、可执行,代表着...

  • restore-ip-addresses

    //IP地址每个字段可能是1位数,2位数或者3位数,每一个字段都位于1~255之间

  • 【C语言学习】一些操作位的技巧总结

    一、操作位的方法 操作位有两种方法,一种是位字段,另一种是使用按位运算符。位字段的方法可查看往期笔记:【C语言笔记...

  • HCIA学习之IP报头/VRP(第四天)

    IP报头重要字段 字段(field):版本(version):4位。 IPv4/IPv6头长度(head leng...

  • 2018-08-31

    1接口测试:1.功能测试:正常流(全字段覆盖,必填字段覆盖)异常流(单字段‘位长,类型,必填和非必填)2.流程测试...

网友评论

      本文标题:位字段

      本文链接:https://www.haomeiwen.com/subject/pcodattx.html