C语言:联合体,位段


1 联合体

  • 共用体
  • 联合体内共用地址空间,即共享内存,从低地址覆盖
    一次只能使用一个成员。
#include<stdio.h>

int main()
{
	struct A//8个字节
	{
		char a;
		int b;
	};

	union B//4个字节
	{
		char a;
		int b;
	};

	return 0;
}
#include<stdio.h>

int main()
{
	struct A//8个字节
	{
		char a;
		int b;
	};

	union B//4个字节
	{
		char a;
		int b;
	}b;
	
	struct A a;
	a.a = 'x';
	a.b = 10000;
	printf("%c,%d\n", a.a, a.b);//x,10000

	//union B b;
	b.a = 'x';
	b.b = 0x12345664;
	printf("%c,%x\n", b.a, b.b);//d,12345664,ab共用地址空间,b覆盖a的数据,即64 56 34 12,64='d'
                                //char:1个字节8个位,一个十六进制数:4个位,'x'占用两个十六进制数字
	return 0;
}

1.1 联合体应用——判断大小端

#include<stdio.h>

bool IsBig()//判断大端
{
	short a = 1;//00000000 00000001
	return *(char*)&a != 1;//大端存储以字节为单位:0 1
	//定义一个(char*)指针指向a的地址,取一个字节,再对其解引用,如果!=1,说明为大端
}

bool IsLittle()//判断小端
{
	union 
	{
		char a;//char1个字节8位,0000 0001
		short b;//00000000 00000001,小端存储以字节为单位:1 0
	}u;
	u.b = 1;
	return u.a == 1;
}
int main()
{
	printf("%d\n", IsBig());//0,PC是小端
	printf("%d\n", IsLittle());//1
	
	return 0;
}

2 位段

  • 位域
  • 在一个结构体中,以位为单位,来指定其成员所占内存长度。
    位段成员必须是整型或枚举类型(通常是无符号unsigned类型);
    如 int a : 20;其中后面的整数规定了成员占用的位数。
  • 不能使用&对位段做取地址运算,不存在位段的指针。

联合体大小需能够整除最大成员所占字节数

struct M//12个字节
{
	char a;//1+3
	struct N
	{
		int b:20;//4
		int c:20;//4
	}n;
};
struct O//16个字节
{
	int a;//4+4
	union P//联合体,考虑单个最大字节,8个字节
	{
		long long b;//8
		int c,d,e,f;//4
	}p;
};
struct Q//36个字节
{
	int a;//4
	union R//32个字节
	{
		short b[4];//8
		int c;//4
	}r[4];
};
struct D//32位/8位=4个字节
{
	int a : 5;//占5个位
	int b : 9;
	int c : 18;
	//float f : 3;
	//int n : 33;//int类型最大32位
};

struct E//5位,4个字节,字节数为4的倍数
{
	int a : 2;
	int b : 3;
};
struct F//25位,以4个字节对齐,8个字节,字节数为4的倍数
{
	int a : 10;
	int b : 20;
	int c : 5;
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值