联合体

通过两个问题作为学习联合体的记录
关键词是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;

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

如何判断当前平台大小端

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

image.png

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

image.png

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


char check()
{

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

我们直到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("大端");
	}
}

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

网站标题:CV鼻祖洋芋

原创文章,作者:locus,如若转载,请注明出处:https://blog.cvpotato.cn/forward-code/c-2/169/

本博客所发布的内容,部分为原创文章,转载注明来源,网络转载文章如有侵权请联系站长!

(0)
上一篇 6天前
下一篇 6天前

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注