C/C++位域结构体
- 作用
- 格式
- 规则
- 尺寸计算(x86下)
- 使用
作用
某些信息的存储表示只需要几个bit位就可以表示,
为了节省存储空间,位域就出现了。
格式
复制代码
1
2
3
4
5
6
7
8
9
10struct 位域结构名 { 位域列表1; 位域列表2; ... }; 位域列表的形式为: 类型说明符 位域名:位域长度; (无位域名,表示仅占位)
如:
复制代码
1
2
3
4
5
6
7struct { char c1 : 3; char c2 : 2; char c3 : 2; }s1; //sizeof=1
规则
一个位域必须存储在同一个字节中,不能跨两个字节
尺寸计算(x86下)
复制代码
1
2
3
4
5
6
7
8struct { char c1 : 3; char c2 : 2; char c3 : 2; }s1; //sizeof=1 说明:char 占一个字节共8位,3+2+2=7;故sizeof(s1)=1。
复制代码
1
2
3
4
5
6
7
8struct { char c1 : 3; char c2 : 3; char c3 : 3; }s2; //sizeof=2 说明:char 占一个字节共8位,3+2+3>8;故sizeof(s2)=2。
复制代码
1
2
3
4
5
6
7
8
9struct { int a : 2; int b : 4; char c; }s3; //sizeof=8 说明:int 占四个字节共32位,2+4<32;故a,b占四个字节,c占一个字节, 结构体字节对齐(按四个字节对齐),故sizeof(s3)=8。
即:
1、若相同类型的位域长度之和小于或等于类型的位数,则取单个该类型的字节数。
2、若相同类型的位域长度之和大于类型的位数,则取多个该类型的字节数之和。
3、不同类型,为各个类型字节数之和。
4、考虑结构体内存对齐
使用
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22#include <iostream> struct Test { int a : 5; int b : 3; }; int main(void) { char str[64] = "hello world"; struct Test obj; memcpy(&obj, str, sizeof(Test)); std::cout << obj.a << std::endl; //8 std::cout << obj.b << std::endl; //3 return 0; }
说明:obj低8位对应’h’,其ASCII为0x68,对应二进制0110 1000;
obj.a占0 1000为8;obj.b占011为3
最后
以上就是要减肥薯片最近收集整理的关于C/C++位域结构体作用格式规则尺寸计算(x86下)使用的全部内容,更多相关C/C++位域结构体作用格式规则尺寸计算(x86下)使用内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复