C语言结构体实现位段

位段是C语言中一种特殊的结构体成员,允许以位为单位定义变量的大小,从而节省内存。不过,位段的使用存在一些不确定性,如位的有符号性、最大位数以及内存分配方向等,这可能导致跨平台时的问题。尽管如此,位段依然是实现特定数据存储优化的有效工具。
摘要由CSDN通过智能技术生成

位段

百度百科对于位段的解释是这样的:

位段,C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域”( bit field) 。利用位段能够用较少的位数存储数据。

声明位段

  1. 位段的成员必须是 intunsigned intchar
  2. 位段的成员名后边有一个冒号和一个数字。
#include <stdio.h>

struct C{
	int a : 2;	// 2位
	int b : 5;	// 5位
	int c : 10;	// 10位
	int d : 30;	// 30位
};
int main () {

	printf("%d" , sizeof(struct C));
	
	return 0;
}

在这里插入图片描述


位段分配空间

struct C{
	char a : 2;	
	char b : 3;
	char c : 4; 
};
int main () {
	
	struct C c = {0};
	c.a = 3;
	c.b = 4;
	c.c = 5;
	
	return 0;
}

在这里插入图片描述
在这里插入图片描述

位段的跨平台问题

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

注:和结构体相比,位段可以达到同样的效果,但是可以很好的节省空间,但是有跨平台的问题。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值