类和结构可包含比整型类型占用更少存储空间的成员。这些成员被指定为位域。位域成员声明符规范的语法如下:

语法

declarator  : constant-expression

下面的示例声明包含位域的结构:

// bit_fields1.cpp
// compile with: /LD
struct Date {unsigned short nWeekDay  : 3;    // 0..7   (3 bits)unsigned short nMonthDay : 6;    // 0..31  (6 bits)unsigned short nMonth    : 5;    // 0..12  (5 bits)unsigned short nYear     : 8;    // 0..100 (8 bits)
};

Date 类型的对象的概念上的内存布局如下图所示。

数据对象的内容布局

请注意,nYear 的长度为 8 位,并且会溢出声明类型 unsigned short 的字边界。因此,它始于新 unsigned short 的开头。并不必使所有位域均适合基础类型的对象;根据声明中请求的位数来分配新的存储单元,因此该结构体大小为4个字节。声明为位域的数据从低位到高位进行排序,如上图所示。

如果结构的声明包含长度为 0 的未命名字段(如以下示例所示),

// bit_fields2.cpp
// compile with: /LD
struct Date {unsigned nWeekDay  : 3;    // 0..7   (3 bits)unsigned nMonthDay : 6;    // 0..31  (6 bits)unsigned           : 0;    // Force alignment to next boundary.unsigned nMonth    : 5;    // 0..12  (5 bits)unsigned nYear     : 8;    // 0..100 (8 bits)
};

则内存布局如下图中所示。

带有零长度位域的数据对象的布局

位域的基础类型必须是整型类型,如基本类型中所述。

总结如下

使用位域的主要目的是压缩存储,其大致规则为:

  • 1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
  • 2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
  • 3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式,Dev-C++采取压缩方式;
  • 4) 如果位域字段之间穿插着非位域字段,则不进行压缩;
  • 5) 整个结构体的总大小为最宽基本类型成员大小的整数倍。
案例如下:
typedef struct  AA{unsigned char b1:5;unsigned char b2:5;unsigned char b3:5;unsigned char b4:5;unsigned char b5:5;
}AA;/*sizeof(AA) = 5*/typedef struct  BB {unsigned int b1:5;unsigned int b2:5;unsigned int b3:5;unsigned int b4:5;unsigned int b5:5;
}BB;/*sizeof(BB) = 4*/typedef struct  CC {int b1:1;int :2;//无影响int b3:3;int b4:2;int b5:3;short b6:4;int b7:1;}CC; /*sizeof(CC) = 12*/

结构体大小计算之位域字段相关推荐

  1. 结构体大小计算与位域大小计算

    结构体大小计算与位域大小计算 本博文纯属个人理解,有错误请多指正. 首先,各个变量所占的字节: 类型 字节(64位) 字节(32位) char 1 1 unsigned char 1 1 short ...

  2. 【C语言进阶深度学习记录】二十 结构体大小计算与结构体内存布局的详细方法

    结构体大小的计算往往是面试笔试常考的知识.对于简单的结构体,可以一眼看出来,对于复杂的结构体,该如何计算结构体占用内存的大小呢? 本文学习所使用的编译器是gcc 4.4.5 使用其他编译器或者使用Wi ...

  3. C语言sizeof结构体大小计算

    一.一般类型 约定为32位系统,即char 1字节.short 2字节.int 4字节,指针是地址4个字节 定义:偏移量 偏移量指的是结构体变量中成员的地址和结构体变量地址的差.结构体大小等于最后一个 ...

  4. 基础 - 结构体大小计算

    1 // 结构体大小.cpp : 定义控制台应用程序的入口点. 2 // 3 4 #include "stdafx.h" 5 #include <windows.h> ...

  5. c语言struct结构体大小计算

    直入主题,要判断一个结构体所占的空间大小,大体来说分三步走: 1.先确定实际对齐单位,其由以下三个因素决定 1> CPU周期 WIN  vs  qt  默认8字节对齐 Linux 32位 默认4 ...

  6. C语言结构体大小计算

    这篇文章来探讨一下C语言中,结构体占的内存大小如何计算. printf("str = %d", sizeof(struct str));//用这个方法来查看一个结构体的大小 我尝试 ...

  7. 结构体大小及其位域问题(from:byr)

    问题: struct mybitfields   {   unsigned short a : 4;   unsigned short b : 5;   unsigned short c : 7;   ...

  8. C语言结构体详解(结构体定义,使用,结构体大小等)

    c语言结构体详解 1.c语言结构体 1.1 结构体基础知识 1.2 结构体声明 1.3 结构体特殊声明 1.4 结构体的自引用 1.5 结构体的大小的计算 1.5.1了解结构体大小计算规则 1.5.2 ...

  9. 结构体大小如何计算?

    以下内容摘自此处: 作者:太平小小草 链接:https://www.jianshu.com/p/e772fff47465 来源:简书 结构体大小计算有三个原则: 一,结构体变量的首地址,必须是结构体 ...

最新文章

  1. Python三十年技术演变史
  2. cheerio api
  3. ABAP 740里的新语法 - LET表达式
  4. 【算法系列之六】两整数之和
  5. linux ppp拨号 USB,linux下ppp拨号上网
  6. mongodb指南(翻译)(十六) - developer zone - 何时使用GridFS
  7. 度量分析之报告信息的四个层次:数据,信息,分析,措施
  8. [Erlang 0022] It solves the right problems in the right way at the right time
  9. mysql join 组合索引,图文详解MySQL中两表关联的连接表如何创建索引
  10. Pascal数据结构与算法
  11. 配置vscode作为STM32代码的编辑器(替代keil5)。实现:代码自动补全, 编译,下载。nRF52也可以编译。
  12. HTML 有序列表 字母,HTML之有序列表教程
  13. [网络安全自学篇] 十六.Python攻防之弱口令、自定义字典生成及网站暴库防护
  14. Unity的WebGL发布在IIS上并加载资源的若干问题
  15. 网站如何过服务器的白名单,服务器怎么添加域名白名单
  16. 使用yagmail模块群发工资条
  17. 用python实现双人五子棋(终端版)
  18. 我可以处理Flutter集成百度地图问题解决
  19. Matlab数字信号处理的仿真系统(具有界面)
  20. 关于B/S模式系统的设计与实现

热门文章

  1. AOP 的详细说明以及基本的使用
  2. Mysql错误1452 - Cannot add or update a child row: a foreign key constraint fails 原因及解决方法
  3. 征服英语的30个好习惯 --- 李阳
  4. 双系统电脑从window切换到ubuntu,外接显示屏用不了了(显卡驱动问题,降低驱动解决)
  5. 【Bugly干货分享】手把手教你逆向分析 Android 程序
  6. 本地客户端 dbeaver-连接HIVE库
  7. 偶然发现一个学习python的好地方
  8. Redis 更新key值导致过期时间失效问题
  9. android listview使用glide异步加载图片错位,闪烁问题
  10. C#:EF与ORM的详解。