位段相关知识总结

位段的声明和结构是类似的,有两个不同:
有关结构体知识,请关注我另外一篇博客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答案一
(萌新不知道怎么对齐,望见谅)

(相关知识点)
位段的跨平台问题

  1. int 位段被当成有符号数还是无符号数是不确定的。
  2. 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机
    器会出问题。
  3. 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
  4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是
    舍弃剩余的位还是利用,这是不确定的。

位段的内存分配
5. 位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型
6. 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。
7. 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。

注:个人结合老师上课内容对结构体的认识,本人萌新可能有许多不正到之处,望周正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值