linux爱好者
分类: LINUX
2016-12-25 15:07:37
最近刚入职公司,还在看代码,看的是一脸懵逼了。今天突然看到一个在结构体中使用冒号的运算,哥们突然就成了傅立叶级数懵逼了。就开始各种百度了,但是呢也没有一个文章给我讲明白,在百度文库上看了几篇,发现都是互相抄的。看了发现还在误导自己,然后自己就试了试,现在分享给大家,大神不要吐槽哈,哥们也是刚搞嵌入式,本文只适合入门呀!
言归正传,先看看本人的环境吧,如果你试验的和我的不一样,以你的为准咯(ubuntu14.04 32位服务器版):
先说说为什么有这个位域这个概念吧,有时候我们需要一个结构体,但是结构体内的成员又不需要存储太多的值,比如我就需要结构体中的一个成员表示开和关这两个状态。那么我们可以使用一个char类型,但是一个char类型又占用8bit。那么有没有一个更好的方法来表示这个概念呢。位域的概念也就应运而生了,我们可以用一个字节中的某几位来表示一个数值。书写方法如下:
这就可以表示,我给a、b、c、d都只分配给一个字节。那么我们就给每个成员赋值把,下面写了个小程序,看看是什么结果。
这个程序看看吧,结果是什么呢,你可以自己考虑一下,我来运行一下看看结果。
大家可以注意一下,a、b和c、d的值为什么不一样呢?这个也很简单,就是因为一位的时候有一个有符号数的符号位。所以会这样。大家看看这个结构体的大小是4byte,那么为什么是4个字节呢?那么就看看下面两个例子吧。
例一:
咱们看这个例子的运行结果,我们发现我们的结构体的内存非配是按照结构体位域里面的最大的数据类型的倍数累分配的。刚才我们用int和long类型的分配4byte,用short时就只分配了2byte。那么这个例子知道了吧?
例二:
下面咱们看这个例子,在编译的时候,就会报错,提示你为char类型非配了9bit,这个明显是不行的。这个例子也很简单。
例三:
咱们看看这个,想了半天也没想到那个例子更好的表示结构体中的内存到底是怎么分配的。这个还是以后大家遇到了自己在试试吧。
说到这里,我遇到的问题我自己也就搞明白了。但是可能这也是皮毛,以后遇到了就再好好分析吧。