今天之前没有接触过位域这个概念,这个概念也很少有书提及。
深入研究之后终于明白了。。。
先以下面的例子进行剖析:
我的理解是 位域是为了节省更多的空间。
但是过多的节省空间,缺并未做存储界限检查,可能会导致 存储数据丢失的现象。
首先我们来分析为什么是16。
这是大家都知道的位的概念
8bit(位)=1Byte(字节)
1024Byte(字节)=1KB
1024KB=1MB
1024MB=1GB
1024GB=1TB
在32位系统中,sizeof(int)是4字节
一个int就是32位。
测试:
一个结构体中 char a :1 ~ char a : 8
sizeof(t)结果都等于1
如果char a : 9;
ERROR:位域类型对位数太小
第二次我测试的是int。
结果是 int a : 1 ~ int a : 32
sizeof(t)结果等于4
如果int a :33
ERROR:位域类型对位数太小
这样一测试就很明白了。
char 最大8位,int最大32位
因此位域限额也为最大值
在测试:
我加了一位进结构体 根据内存对其原则 结果为8 即64位
因此 下面例子不难解释:
这个例子先一直不懂 现在明白了。
重c~d的内存中间空余了 32-4-4-3 = 21位。
为了成立上面的说法,再测:
这里又有不懂得地方了,先睡觉,明天在说
2009年5月16日
继续写。
上面32位是4 但是double是8字节对齐 所以 在double前有64位可以利用。
就是这么简单,我自己想复杂了。
还有一点说明的是,double是会干扰你的位域的。
结果24,很显然 这样double干扰了位域的存放。
好了,存放原理基本明白了。
下面研究一下数据是如何保存的。
32位机器上,int是32位 就是FF FF FF FF。
那么一个F 就是8位
一个char 也是8位 就是一个F。
下面是一个例子,看懂了什么都明白了:
看完还不懂就仔细读读我转的下个文章。