位段的声明和结构是类似的,有两个不同:
有关结构体知识,请关注我另外一篇博客https://blog.csdn.net/sakeww/article/details/105820602
1.位段的成员必须是 int、unsigned int 或signed int 。
2.位段的成员名后边有一个冒号和一个数字。
下面我用两道相关类型的题,进行解释
一.
struct S
{
int a : 2;
int b : 5;
int c : 10;
int d : 30;
};
int main()
{
struct S s;
printf("%d\n", sizeof(s));//8个字节
return 0;
}
分析:int为 四个字节=32个比特位
2+5+10=17 30
因为32-17=15<30 所以30 在第二个
占四个字节 占四个字节
4 + 4 =8
注:int a : (这个数字不能大于32)
二.
struct S
{
char a : 3;
char b : 4;
char c : 5;
char d : 4;
};
int main()
{
struct S s = { 0 };
s.a = 10;
s.b = 20;
s.c = 3;
s.d = 4;
printf("%d\n", sizeof(s));
printf("%d %d %d %d ", s.a, s.b, s.c, s.d);
return 0;
}
输出结果:
3
2 4 3 4
分析:
内存中的存储过程:
3 4 5 4个比特位
10 20 5 4
a 010 b 0100 c 00011 d 0100
2 4 3 4即为答案二
a 010 b 0100 c 00011 d 0100
0010 0100 0000 0011 0000 0100 0000 0000
2 2 0 3 0 4 0 0
3+4 5 4
1 + 1 + 1=3答案一
(萌新不知道怎么对齐,望见谅)
(相关知识点)
位段的跨平台问题
- int 位段被当成有符号数还是无符号数是不确定的。
- 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机
器会出问题。 - 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
- 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是
舍弃剩余的位还是利用,这是不确定的。
位段的内存分配
5. 位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型
6. 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。
7. 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。
注:个人结合老师上课内容对结构体的认识,本人萌新可能有许多不正到之处,望周正。