关于位域个人理解
2009-08-11 14:20
513 查看
作者:曹忠明,华清远见嵌入式学院讲师。
有很多学生问我,为什么很多地方都说位域不能跨越两个字节,而自己写得程序明显看到某一位域跨越的两个字节,为此感到不解。下面我说一点我个人的理解。先看例子:
#include <stdio.h>
struct date1
{
short a:4;
short b:5;
short c:4;
};
struct date2
{
short a:4;
short b:5;
short c:8;
};
struct date3
{
short a:4;
short b:5;
int c:8;
};
int main()
{
printf("%d/n %d/n %d/n",sizeof(struct date1),
sizeof(struct date2), sizeof(struct date3));
return 0;
}
程序的结果是:
2
4
4
在例子中的date1中的位于b明显是跨越了两个字节,为什么和定义的不一样呢。那么我们再看一下date2,date2的大小是4,我想这里正式说明位域不能跨越两个字节的说法。我认为说位域不能跨越两个字节是说当当前数据类型不能存放下剩余的位域,那么这个位域不能跨越两个字节存放,而是重新分配一个当前数据类型大小的空间存放。这也就说明了为什么date1是合理的。date3中有两个数据类型的位域,两个short型一个int型,那么这个位域是怎么存储的呢?例子的结果显示这个结构的大小只有4,显然不是为short分配一段空间,再为int分配一段空间,而是将这三个位域全部放进了一个int型数据中存储。由此可以看出,位域在允许的情况下尽量少的空间存放多的数据。是一个为我们节省空间的好东西。
这里只是个人理解,有什么问题希望大家留言,共同探讨!
有很多学生问我,为什么很多地方都说位域不能跨越两个字节,而自己写得程序明显看到某一位域跨越的两个字节,为此感到不解。下面我说一点我个人的理解。先看例子:
#include <stdio.h>
struct date1
{
short a:4;
short b:5;
short c:4;
};
struct date2
{
short a:4;
short b:5;
short c:8;
};
struct date3
{
short a:4;
short b:5;
int c:8;
};
int main()
{
printf("%d/n %d/n %d/n",sizeof(struct date1),
sizeof(struct date2), sizeof(struct date3));
return 0;
}
程序的结果是:
2
4
4
在例子中的date1中的位于b明显是跨越了两个字节,为什么和定义的不一样呢。那么我们再看一下date2,date2的大小是4,我想这里正式说明位域不能跨越两个字节的说法。我认为说位域不能跨越两个字节是说当当前数据类型不能存放下剩余的位域,那么这个位域不能跨越两个字节存放,而是重新分配一个当前数据类型大小的空间存放。这也就说明了为什么date1是合理的。date3中有两个数据类型的位域,两个short型一个int型,那么这个位域是怎么存储的呢?例子的结果显示这个结构的大小只有4,显然不是为short分配一段空间,再为int分配一段空间,而是将这三个位域全部放进了一个int型数据中存储。由此可以看出,位域在允许的情况下尽量少的空间存放多的数据。是一个为我们节省空间的好东西。
这里只是个人理解,有什么问题希望大家留言,共同探讨!
相关文章推荐
- 关于verilog里阻塞与非阻塞赋值的个人理解
- 关于WebRtc的一些个人理解
- (转载)关于WS_CLIPCHILDREN和WS_CLIPSIBLINGS的理解(个人认为还是相当全面的)
- 关于hough变换的个人理解
- 关于 js 的 prototype , call,apply ,闭包,回调 个人浅显理解
- 关于Dijkstra算法的个人理解
- 关于Myeclipse调试的一些个人理解
- 关于高维空间的个人理解
- 关于java反射的个人理解
- 关于数组的一些个人理解和源码
- [置顶] 关于反射的个人理解
- 关于计算机中补码的个人理解
- 关于SVM的一点个人理解
- 关于 async 与 await的个人理解
- 关于google protocol buffer(PB)的优缺点和一些个人的理解
- 个人关于“this”关键字的理解
- 关于$emit $broadcast 和&on的个人理解
- 关于C语言静态链接的个人理解,欢迎指正
- 关于scala的=>作用 个人理解简述
- 关于JAVA面向对象基础整理以及个人的理解(适合初学者阅读)