• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 浅析C语言位域和位段

浅析C语言位域和位段

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c语言位域,c语言位域操作,c语言中的位域,c位域,位域等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

C结构体之位域(位段)
有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。

一、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为:
struct 位域结构名
{
位域列表
};其中位域列表的形式为:

类型说明符 位域名:位域长度
位域变量的说明与结构变量说明的方式相同。 可采用先定义后说明,同时定义说明或者直接说明这三种方式。例如:


1. 一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如:

3. 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:

上例程序中定义了位域结构A,两个个位域为a(占用5位),b(占用3位),所以a和b总共占用了结构A一个字节(低位的一个字节)。

当程序运行到14行时,d内存分配情况:

 d.b内存中二进制表示为001,由于d.b为有符号的整型变量,输出时要对符号位进行扩展,所以结果为1(二进制为00000000000000000000000000000001)

三、位域的对齐
如果结构体中含有位域(bit-field),那么VC中准则是:

1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;

2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;

3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式(不同位域字段存放在不同的位域类型字节中),Dev-C++和GCC都采取压缩方式;

系统会先为结构体成员按照对齐方式分配空间和填塞(padding),然后对变量进行位域操作。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 详解C语言位域的使用与注意事项
  • C语言 位域详解及示例代码
  • 关于大小端、位域的一些概念详解
  • c/c++语言位域注意事项分析
  • 浅析C语言位域和位段

相关文章

  • 2017-05-28排序算法模板实现示例分享
  • 2017-05-28详解散列表算法与其相关的C语言实现
  • 2017-05-28用标准c++实现string与各种类型之间的转换
  • 2017-05-28数组指针、指针数组以及二位数组的深入解析
  • 2017-05-28C++中用substr()函数消除前后空格的解决方法详解
  • 2017-05-28浅析_tmain()与main()的区别
  • 2017-05-28C语言之栈和堆(Stack && Heap)的优缺点及其使用区别
  • 2017-05-28VC++中HTControl控件类的CHTSlider控制杆控件类简介
  • 2017-05-28数组中求第K大数的实现方法
  • 2017-05-28详解C语言中getgid()函数和getegid()函数的区别

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C++实现简单的希尔排序Shell Sort实例
    • 详解C++中StringBuilder类的实现及其性能优化
    • 简要解读C++的动态和静态关联以及虚析构函数
    • 为什么要学习C语言 C语言优势分析
    • C#如何调用原生C++ COM对象详解
    • C语言压缩文件和用MD5算法校验文件完整性的实例教程
    • 详解C++中变量的初始化规则
    • C++ 自定义控件的移植问题
    • 浅析C++中cout的运行机制
    • 详解C++编程中的私有继承和公有继承

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有