联合体

通过两个问题作为学习联合体的记录
关键词是Union 使用方法和结构体基本无差别 唯一不同的是联合体的成员共用一块内存空间,而结构体是每个成员都有自己的空间
即Union _Ua
{
int age;
char str;
}Ua,*PUa;
&Ua=&Ua.age = &Ua.str;

联合体的大小

typedef union _Ua
{
	char str[17];
	short a;
	int b;
	struct {
		int b;
		char a;
		short c;
		double d;
	}st;
}Ua,*PUa;
C++

联合体的大小根据联合体中最大的成员变量来定,同时联合体本身的大小必须是最大的数据类型的整数倍最大肯定是char str[17] 数据本身大小是17 同时他并不是最大数据类型double 的整数倍所以该联合体大小为3*8 = 24
如果字符数组改成10的话 联合体大小是16

如何判断当前平台大小端

大端:高地址存放低位数据,低地址存放高位数据
小端:高地址存放高位数据,低地址存放地位数据
用什么方式存放的数据,必须用什么方式来读,否则就会出错

联合体

这样可能看不出来什么,我们用十六进制看一下

联合体

很明显高位数据存放早高地址,低位数据存放在低位地址
代码实现:
1.我们读取一个数据的一个字节就可以判断到底是从哪头开始的


char check()
{
	i = 1;
	return *(char*)&x.i;
}
int main()
{
char ret = check();
	if(ret == 1)
{
printf("小端");
}
	else
	{
	printf("大端");
	}
}
C++

我们直到1是四字节,0000 0000 0000 0001 如果0001存放在低地址说明是小端,如果是0说明是大端
2.通过联合体

typedef _Ua
{
int a;
char b;
}Ua,*PUa;
int main()
{
Ua U;
U.a = 1;
	if(U.b == 1)
	{
	printf("小端");
	}
	else
	{
	printf("大端");
	}
}
C++

这利用了联合体共用一个地址的性质,u.b占了u.a最后一个字节,即是否是0001来判断

C语言

位运算

2024-11-14 18:45:58

C语言

编译预处理

2024-11-14 19:10:33

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索

Powered by atecplugins.com