【C】位段

位段

位段类似于结构体,不过开辟空间有它的一套规律!
位段只能存储整型变量,常见的int,char,long,long long,以及它们的无符号形式。
以下操作在VS中进行!

情况1

#include<stdio.h>

typedef struct Node {

		char _b : 5;//5个比特位
		char _c : 2;//2个比特位

}Node;

int main()
{
	Node n;
	printf("%d\n",sizeof(n));
	return 0;
}

运行结果是1个字节!
VS的处理方式:由于5+2小于8(一个字节),所以只申请了一个字节的空间。

#include<stdio.h>

typedef struct Node {

		char _b : 5;//5个比特位
		char _c : 8;//8个比特位

}Node;

int main()
{
	Node n;
	printf("%d\n",sizeof(n));
	return 0;
}

运行结果是2字节!
VS的处理方式:由于5+8大于8(一个字节),所以申请了两个字节的空间。

情况二

#include<stdio.h>

typedef struct Node {
		int _a : 2;//2个比特位
		char _b : 5;//5个比特位
		char _c : 2;//2个比特位
}Node;

int main()
{
	Node n;
	n._a = 20;
	n._b = 20;
	n._c = 20;
	printf("%d\n", sizeof(int));

	printf("%d\n",sizeof(n));
	return 0;
}

在这里插入图片描述

#include<stdio.h>

typedef struct Node {
		int _a : 2;//2个比特位
		char _b : 5;//5个比特位
		char _c : 8;//8个比特位
}Node;

int main()
{
	Node n;
	n._a = 20;
	n._b = 20;
	n._c = 20;
	printf("%d\n", sizeof(int));

	printf("%d\n",sizeof(n));
	return 0;
}

在这里插入图片描述
由上面两个例子说明,int类型是4字节大小,char是1字节大小,编译器不考虑是否占满int申请的4个字节的内存空间,而是当两个类型不一致,直接再增加一个int大小的内存空间。
可以试试,long long类型和char类型。也是如此。

不推荐使用位段

  1. int类型是有符号还是无符号的问题;
  2. 位段的分配规则不确定;
  3. 是否要利用前一个变量剩余的比特位不确定;
  4. 16位机器和32位机器的最大位不确定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小吴cc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值