通过两个问题作为学习联合体的记录
关键词是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
如何判断当前平台大小端
大端:高地址存放低位数据,低地址存放高位数据
小端:高地址存放高位数据,低地址存放地位数据
用什么方式存放的数据,必须用什么方式来读,否则就会出错
这样可能看不出来什么,我们用十六进制看一下
很明显高位数据存放早高地址,低位数据存放在低位地址
代码实现:
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/
本博客所发布的内容,部分为原创文章,转载注明来源,网络转载文章如有侵权请联系站长!