我是靠谱客的博主 要减肥薯片,这篇文章主要介绍C/C++位域结构体作用格式规则尺寸计算(x86下)使用,现在分享给大家,希望可以做个参考。

C/C++位域结构体

  • 作用
  • 格式
  • 规则
  • 尺寸计算(x86下)
  • 使用

作用

某些信息的存储表示只需要几个bit位就可以表示,
为了节省存储空间,位域就出现了。

格式

复制代码
1
2
3
4
5
6
7
8
9
10
struct 位域结构名 { 位域列表1; 位域列表2; ... }; 位域列表的形式为: 类型说明符 位域名:位域长度; (无位域名,表示仅占位)

如:

复制代码
1
2
3
4
5
6
7
struct { char c1 : 3; char c2 : 2; char c3 : 2; }s1; //sizeof=1

规则

一个位域必须存储在同一个字节中,不能跨两个字节

尺寸计算(x86下)

复制代码
1
2
3
4
5
6
7
8
struct { 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
8
struct { 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
9
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、考虑结构体内存对齐

使用

复制代码
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下)使用内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(67)

评论列表共有 0 条评论

立即
投稿
返回
顶部