经过个人查阅相关的资料和理解,现对C语言的位域做一个总结,对于位域的定义我在这里没有多说,我这里主要是对位域有歧义的地方进行系统的总结.我个人觉得总结的比较完整,如有不够完整或有异义的地方大家可以留言指点.
1.位域又叫位段(位字段),是一种特殊的结构成员或联合成员(即只能用在结构或联合中),用于指定该成员在内存存储时所占用的位数,从而可以在机内更紧凑地表示数据。
2.位域的使用主要出现在如下两种情况:
(1)当机器可用内存空间较少而使用位域可以大量节省内存时。如,当把结构作为大数组的元素时。
(2)当需要把一结构或联合映射成某预定的组织结构时。例如,当需要访问字节内的特定位时。
3.当要把某个成员说明成位域时,其类型只能是int,unsigned int与signed int三者之一(说明:int类型通常代表特定机器中整数的自然长度。short类型通常为16位,long类型通常为32位,int类型可以为16位或32位.各编译器可以根据硬件特性自主选择合适的类型长度.见The C Programming Language中文 P32)。
4.带位域的结构在内存中各个位域的存储方式取决于具体的编译程序;它们既可以从左到右,也可以从右到左存储。
5.在一包含位域说明的强构或联合区分符中也可以同时说明普通成员,例如:
struct st1
{
unsigned a:7;
unsigned b:4;
unsigned c:5;
int i; //i是普通成员,这会被存放在下一个字,即字对齐
};
6.int值不能跨字存放,同样位域也最好不要跨字存放(意思说是说:各位域的分配位数加起来要在16位或32位以内,如果编译器分配int为16位,则加起来要在16位以内,如果加起来大于16位,则最好空出剩余的位域,从下一个字开始分配位域).
7.特殊宽度0或者说长度为0的无名位域有着特殊的用途.它用于指示将其前后的两个位域或成员分开放在两个字中, 即将位于该无名位域后的下一个位域从下一个字开始存放.
8.位域备注:
关于位域还需要提醒读者注意如下几点:
其一,位域的长度不能大于int对象所占用的字位数.例如,若int对象占用16位,则如下位域说明是错误的:
unsigned int x:17;
其二,由于位域的实现会因编译程序的不同而不同,在此使用位域会影响程序的可移植性,在不是非要使用位域不可时最好不要使用位域.
其三,尽管使用位域可以节省内存空间,但却增加了处理时间,在为当访问各个位域成员时需要把位域从它所在的字中分解出来或反过来把一值压缩存到位域所在的字位中.
其四,位域的位置不能访问,因些不能对位域使用地址运算符号&(而对非位域成员则可以使用该运算符).从而,即不能使用指向位域的旨针也不能使用位域的数组(因为数组实际上就是一种特殊的指针).另外,位域也不能作为函数返回的结果.
最后还要强调一遍:位域又叫位段(位字段),是一种特殊的结构成员或联合成员(即只能用在结构或联合中).
说明:以上大多数文字摘自《ANSI C标准详解》及《The C Programming Language中文第二新版》.在此对以上两本参考书的团体表示感谢.
加速度 March.6.2010
分享到:
相关推荐
总结来说,位域、结构体嵌套和联合是C语言中处理数据结构的重要工具,它们各自提供了一种独特的方式来组织和操作内存,从而满足不同的编程需求。理解和熟练运用这些概念对于编写高效且灵活的C语言代码至关重要。
总结来说,位域、结构嵌套和联合都是C语言中处理复杂数据结构和高效存储的有效工具。位域适用于精确控制位宽的需求,结构嵌套用于构建层次化的数据模型,而联合则在需要多种类型共用同一存储空间的场景下发挥作用。...
位域研究总结 位域(Bit-fields)是 C 语言和 C++ 语言中都有的一个概念,但是位域有很多需要注意的问题。其中一个重要的问题是大端和小端字节序的问题。 大端和小端字节序是计算机科学中的一种约定,用于描述多...
- **C语言基础知识**:运算符、优先级、流程控制语句等,是任何C平台的基础。 - **结构体、联合体和位域**:理解它们的用途和场景,有助于理解TI例程的结构。 - **变量作用域和生存期**:对于模块化编程至关重要...
位域的使用基于C语言的标准,虽然不是所有编译器都完全支持,但大多数现代嵌入式编译器(如GCC)提供了良好的位域支持。在上述示例中,我们定义了一个名为`TIME`的结构体,它包含三个位域:`seconds`、`minutes`和`...
位域是C语言中一种特殊的数据结构,它允许开发者在单个整数类型变量中定义多个字段,每个字段占用固定的比特位(bit)。这种特性使得开发者能够高效地利用存储空间,尤其是在处理硬件寄存器等特定场景时尤为有用。 ##...
以下是对给定文件中提及的C语言知识点的详细总结,适合考试复习和深入理解。 ### 第1章 C语言概述 #### 1.1 C语言标识符 C语言中的标识符用于命名变量、函数、数组等实体。一个合法的标识符必须遵循以下规则: - ...
总结,C_GoL项目通过C语言和位域技术实现了康威生命游戏的高效模拟,展示了在编程中如何利用特定数据结构和算法优化性能。对于想要深入理解C语言特性和元胞自动机的人来说,这是一个极好的学习资源。
c) 如果相邻的位域字段类型不同,则它们之间不能压缩,编译器的实现方式可能会有所不同。 d) 如果位域字段之间存在非位域字段,那么不会进行压缩。 e) 结构体的总大小是其最宽的基本类型成员大小的整数倍。 例如,...
总结来说,位域、内存对齐、内存中的存储和内存地址是C语言中涉及内存管理的重要概念。理解这些概念对于编写高效、优化的C代码至关重要,特别是在嵌入式系统或资源受限的环境中。通过实践和研究提供的代码示例,你...
内容概要:本文全面介绍了C语言的基础知识,涵盖C语言的历史背景、语言特点、环境设置、程序结构、数据类型、变量、常量、运算符、控制结构、函数、指针、数组、字符串、结构体、共用体、位域、预处理器、文件读写、...
在C++编程中,经常会遇到一些常见问题,这些问题的解决方法对初学者来说尤其重要。以下是对这些关键知识点的详细解释: 1. `printf()`格式控制...在实践中不断学习和总结,能够帮助开发者避免常见错误,提高编程效率。
在C/C++混合编程中,通常会在C++源文件中使用`extern "C"`来确保C语言函数或变量可以在C++环境中正确链接。但是,错误地将`#include`指令放置在`extern "C"`块内可能会引发问题,尤其是在C++编译器中。这是因为`#...
《C/C++面试基础知识总结》 C/C++是两种强大的编程语言,它们在软件开发领域有着广泛的应用。面试时,了解这些语言的基础知识是至关重要的。以下是对C/C++面试基础知识的详细解释: 1. **const和static作用**:`...
1. C语言参考手册的组织:包括引言、C的基本元素、程序结构、说明和类型、表达式和赋值、语句、函数、C语言语法总结、实现定义的行为。这些部分共同构成了C语言编程的基础和高级特性。 2. 本手册的范围:强调了...
C语言各种常用关键字详细解释学习,都是总结面试,都是比较好的笔试题。 1 变量 3 1.1 全局变量,局部变量,,常量分别保存在内存中的什么地方? 3 1.2 不同类型的变量,你是否知道其作用域? 3 1.3 全局变量和局部...
而是只对C语言中不容易被初学者理解的重点、难点和疑点进行了细致而深入的解读,揭露了C语言中那些鲜为普通开发者所知的秘密,旨在让读者真正掌握C语言,从而编写出更高质量的C程序代码。 全书一共11章:第1章重点...
C语言中的位段(bit-field)是C语言中一种...总结,C语言中的位段是处理位级操作的有效工具,尤其在资源受限的环境或需要精细控制硬件寄存器的场景下。通过理解和熟练运用位段,开发者可以编写出更加高效和灵活的程序。
总结起来,嵌入式C编程规范涉及位运算的运用、控制位域的理解以及遵循AAPCS进行混合编程。掌握这些技能,开发者可以更有效地编写出高效且适应硬件的嵌入式程序。在实际开发中,结合C语言的便捷性和汇编语言的直接性...