大小端模式如何影响位域中各成员的位序;位域的其他细节问题
我们直接来看图:
在上面的示意图中,我们定义了一个位域,位域中的成员
共同划分了一个uint8_t类型的内存空间,划分成了4份,
第一个位域成员占2bit,第二个位域成员占3bit,以此类推
我们都知道,大小端模式对结构体和位域中的成员的排列顺序
是没有什么影响的,但是大小端模式会影响位域中成员位序的排列
比如,看上图:在小端模式下,位域成员a的空间中,bit0(最低位)
在低地址上,bit1(比bit0稍高的位)在稍微高的地址上
再看看小端模式下的位域成员b,也是同样的道理,bit2<bit3<bit4
所以bit2排在成员b的最前面越前面地址越低
再看看大端模式下的位域成员a,bit1是高位,bit0是低位,
所以bit1就排在低地址上,bit0就排在高地址上
大端模式下的位域成员b中,bit4是最高的位,因此它排在成员b
空间中的最低位
总结一下:大小端模式不会影响位域中成员的排列顺序,因为位域中
成员的排列顺序永远都是从低地址开始,然后递增,但是大小端模式
会影响位域中各个成员位序的排列
第二部分:如何打印出来位域的值?
定义一个位域结构体,类型为bitfield_type
通过这个类型重新定义一个变量 x
给变量x中的成员a赋值为2
现在我们的目的是:想要把位域结构体X
当做是一个整型变量来打印出来
首先是取出x的首地址,将其强制类型转换成uint8_t 的类型
再进行解引用,就是x的值了
然后通过printf语句进行打印,以2位十六进制的格式进行输出,不足补零
第三部分:大小端模式对位域中的多个类型域的内存排列没有影响
在前面的博客中,我们说到了大小端模式会对位域中
各个成员的位序有影响,但是大小端模式并不会对
多个类型域的内存分布造成影响。
首先先来解释一下什么叫做类型域?
所谓的类型域,指的是位域结构体中由相同基础数据类型
(如uint8_t uint16_t 等)的位域成员组成的连续位区域
先来看一下有多个类型域的位域的定义吧
可以看到,在一个位域中,我们定义了多个类型域,
但是这些类型域的排列顺序并不会受到大小端模式的干扰
也就是说,类型域1永远在低地址上,类型域2永远在高地址上
不知道我这样说,你们明白了没有
第四部分:位域和结构体有很多相似点(可以类比)
1.位域中的成员相当于结构体中的成员变量
2.位域中的多个类型域相当于结构体中的子结构体变量,
也就是结构体的嵌套
3.位域中的成员和结构体中的成员变量都有一样
在内存中的存放顺序都是先从低地址再到高地址
最后我们来讲一下一些关于位域的细节问题:
1.位域的赋值,不要超过其位数所能够表达的数值
如int a:3最大可以赋值为7,如果超过就会截断
如果给int a:3赋值8(1000),发生截断现象,最终的结果为0
2.位域在运算时会自动升级为无符号八位整型
3.赋初值:位域的赋初值和结构体变量的赋初值相似
可以直接进行成员化赋值
好了,这就是我们这篇博客的内容,