概述
C/C++位域结构体
- 作用
- 格式
- 规则
- 尺寸计算(x86下)
- 使用
作用
某些信息的存储表示只需要几个bit位就可以表示,
为了节省存储空间,位域就出现了。
格式
struct 位域结构名
{
位域列表1;
位域列表2;
...
};
位域列表的形式为:
类型说明符 位域名:位域长度;
(无位域名,表示仅占位)
如:
struct {
char c1 : 3;
char c2 : 2;
char c3 : 2;
}s1;
//sizeof=1
规则
一个位域必须存储在同一个字节中,不能跨两个字节
尺寸计算(x86下)
struct {
char c1 : 3;
char c2 : 2;
char c3 : 2;
}s1;
//sizeof=1
说明:char 占一个字节共8位,3+2+2=7;故sizeof(s1)=1。
struct {
char c1 : 3;
char c2 : 3;
char c3 : 3;
}s2;
//sizeof=2
说明:char 占一个字节共8位,3+2+3>8;故sizeof(s2)=2。
struct {
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、考虑结构体内存对齐
使用
#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下)使用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复