自定义结构体类型

目录

1、位段

位段的好处:

位段的内存分配 :

 位段的跨平台问题 :

2、枚举

枚举 define都可以定义常量

3、联合体

定义:

联合体大小计算:


1、位段

位段的好处:

位段 - 节省空间 - 不支持跨平台

其中位段的位是指:二进制位

位段的内存分配 :

1. 位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型

2. 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。

3. 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。

下面介绍下如何计算位段的大小

struct s
{
	int a : 2;//2个比特位 
	int b : 5;//5个比特位 
	int c : 10;//10个比特位 
	int d : 30;//30个比特位  
}; 

int main()
{
	struct s s;
	printf("%d ",sizeof(s));//8个字节 
	return 0;
	
}

按照上面占用比特位大小计算 占47个比特位   应该是6个字节 -但实际却是8个字节

以下对存放int为例:

 以下对存放char为例:

struct t 
{
	char a : 3;//3个比特位 
	char b : 4;//4个比特位
	char c : 5;//5个比特位
	char d : 4;//4个比特位	
}; 
 
int main()
{
	struct t t = {0};
	printf("%d ",sizeof(t));//3 
	return 0;
}

按照上面占用比特位大小计算 占16个比特位   应该是2个字节 -但实际却是3个字节

 位段的跨平台问题 :

1. int 位段被当成有符号数还是无符号数是不确定的。

2. 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机 器会出问题。

3. 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。

4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是 舍弃剩余的位还是利用,这是不确定的。

总结:

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

2、枚举

枚举 define都可以定义常量

enum Sex
{
	//枚举的可能取值 - 常量 
	MALE = 2,
	FEMALE = 4,
	SECRET = 8//给常量赋初始值  不进行赋初始值 则为0 1 2(不初始化就是上一个加一) 
}; 

int mian()
{
	enum Sex s = MALE;
	
	return 0; 
}

3、联合体

定义:

union Un
{
	char c;
	int i;
}; 

int main()
{
	nuion Un u;
	printf("%d",sizeof(u));//4
	return 0;
}

联合体大小计算:


union Un 
{
	char arr[5];//5个1 
	int i;//4
}; 

最小为对齐数的整数倍 最大对齐数位4 但是如果为4 则放不下arr 所以为8

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

学代码的小呆鸟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值