c语言的位域,字节对齐

c语言的位域,字节对齐

ID:9240695

大小:40.50 KB

页数:5页

时间:2018-04-24

c语言的位域,字节对齐_第1页
c语言的位域,字节对齐_第2页
c语言的位域,字节对齐_第3页
c语言的位域,字节对齐_第4页
c语言的位域,字节对齐_第5页
资源描述:

《c语言的位域,字节对齐》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、C的位域(bitfields)C语言位域的最大作用是简化位操作,可以让开发者以直观的方式来操作某一位.如下列定义structbs{inta:7;intb:2;intc:1;};表示用一个整数的前8位表示a,用一个整数的2位表示b,用一个整数的1位的来表示c,位域定义不能超过数据定义类型的最大位,如struct{chara:9;//char最大值为8位intb:33;//int的最大值为32,不能超过其中定义值}位域有如下特殊定义,1)只要不超过数据定义最大值,多个位域可以定义一个数据单位里,如下是合法,定义,也是常用定义StructPC_PIN{Charbit0

2、:1,bit1:1,Bit2:1,Bit3:1,Bit4:1,Bit5:1,Bit6:1,Bit7:1;}2)位域可以采用’匿名',定义,这样程度就不能使用这些位,这样定义纯粹是起占位用.structfoo1{ int a:1; int  :2; short c:1;};上例中,在a和c中有一个2位的匿名占位structbs{unsigneda:4unsigned:0/*空域*/unsignedb:4/*从下一单元开始存放*/unsignedc:4}在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。位域占位计算有

3、点复杂1.定义位域不足一个数据位的,按一个完整数据算StructtagA{Inta:3;Intb;};Sizeof()值是8,因为a仍然按4位来核算.2.如果连续定义几点相同类型.而位域总合不超过类型总位数长度的,会被编译器设为一个合并为一个位域定义如structtagA{inta:1;intb:2;intc;3}等同于structtagB{Inta:1,b:2,c:3;};Sizeof()的长度都是4,因为tagA的各个成员加起长度都没有超过32,所以仍然为43.aaa位域的被广泛应用于8位单片机编程中.因为一个8位寄存器刚好是一个char的宽度,因为可以定义

4、一个8个位位域来对寄存器的各个位进行存取.这样程序比较简单并且好理解.但在32位CPU应用反而不广泛,因为32CPU的寄存器是为32位宽度,正好是一个int的宽度,但int在不同CPU中的表示顺序位是不一致的.在不同字节序CPU里定义的位域,有一些不样,换句话说,定义这样位域需要定义两套类型.如ip的头定义.以下取自Linux中,linux/ip.hstructiphdr{#ifdefined(__LITTLE_ENDIAN_BITFIELD)__u8ihl:4,version:4;#elifdefined(__BIG_ENDIAN_BITFIELD)__u8v

5、ersion:4,ihl:4;#else#error"Pleasefix"#endif__u8tos;__u16tot_len;__u16id;__u16frag_off;__u8ttl;__u8protocol;__u16check;__u32saddr;__u32daddr;/*Theoptionsstarthere.*/};使用反而不如位操作定义方便,因此32位CPU使用位域有一些麻烦字节对齐现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但为为了CPU访问数据的快速,通

6、常都要求数据存放的地址是有一定规律的.比如在32位CPU上,一般要求变量地址都是基于4位,这样可以保证CPU用一次的读写周期就可以读取变量.不按4位对齐,如果变量刚好跨4位的吗,这样需要CPU两个读写周期.效率自然低下.因此,在现代的编译器都会自动把复合数据定义按4位对齐,以保证CPU以最快速度读取,如下例(gccversion3.2.2编译器(32位x86平台))structA{   inta;   charb;   shortc;};结构体A中包含了4字节长度的int一个,1字节长度的char一个和2字节长度的short型数据一个。所以A用到的空间应该是7字

7、节。但是因为编译器要对数据成员在空间上进行对齐。所以使用sizeof(strcutA)值为8。现在把该结构体调整成员变量的顺序。structB{   charb;   inta;   shortc;};这时候同样是总共7个字节的变量,但是sizeof(structB)的值却是12,因为b+a已经超过32,编译无法合并在一个空间,干脆分配了4个byte空间.但这样分配空间一个不好结果就是,各个成员的相对起移地址,的位移是不确定的.在不同CPU的有不同结果.这样对于经常处理网络包的嵌入式C程序员是一个大问题如下例,假设某人设计不一不按4位对齐的包协议,如下前一个1位

8、表示版本号,第2-5位表

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。