码迷,mamicode.com
首页 > 其他好文 > 详细

C结构体中位域

时间:2014-10-29 10:33:16      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   color   os   ar   使用   sp   

  C结构体中位域的一点小知识,最近在看资料时遇到结构体中的一种特殊操作——位域,在下面的程序中我将根据自己的理解进行简单介绍。程序只是为了了解位域的一些性质,运行时有些编译器可能会报错。

  程序代码如下(C++编写),编译器使用的是C-Free,整型变量占4个字节。(由于刚接触,如有错误,还请大家指正。)

 1 #include<iostream>
 2 using namespace std; 
 3 
 4 struct bit {
 5     int a:3;
 6     int b:2;
 7     int c:3;
 8 };
 9 
10 int main () {
11     struct bit s;
12     char *c = (char*)&s;
13     cout<<sizeof(s)<<endl;
14     *c = 0x99;
15     *(c+1) = 0x97;
16     cout<<s.a<<endl<<s.b<<endl<<s.c<<endl;
17     return 0;
18 }

  程序第5-7行使用到了位域,成员a、b、c虽为整型,但是却明确限制了实际的长度,其中a为3个二进制位,b为2个二进制位,c为3个二进制位。程序的执行结果如下:

bubuko.com,布布扣

  第一个表示结构体的长度,由于3个成员实际都没有占用4个字节,所以实际的长度不是12。下面搞清了a、b、c实际的存储关系后就更加清楚了,位域变量在实际存储中是逆序存储的(不知道为什么),则实际的存储情况如图:3个变量一起正好组成一个字节的长度,程序第14行,*c=0x99,则:a = 001B,b = 11B,c = 100B。由于3个数都是整型,默认是带符号的,故a为1,b为-1,c为-4。

bubuko.com,布布扣

  如果是这样,那如果3个变量的长度多于8个二进制位呢,将结构体修改为如下(将b的二进制位改为3):

1 struct bit {
2     int a:3;
3     int b:3;
4     int c:3;
5 };

  这种情况下又该如何存储呢?由于一个字节不足以存放3个变量,那么c是分两个字节存储,还是直接存储在下一个字节的低位呢?运行上述程序,得到结果如下:

bubuko.com,布布扣

  c的结果是-2,如果是存储在下一个字节的话,c = 111B,对应的整型数应该为-1,但实际为-2,说明不是这种方式。在看分两个字节存储的方式,在这种方式下c = 110B,正好是-2。为了进一步确认,将程序第14行的赋值操作改为:*c = 0x59;

  执行后结果如下:

bubuko.com,布布扣

  这说明是分两个字节存储的,存储位置如下:

bubuko.com,布布扣

  由于编译器不同,处理的方式也有可能不同。

C结构体中位域

标签:style   blog   http   io   color   os   ar   使用   sp   

原文地址:http://www.cnblogs.com/luop/p/4058044.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!