c语言中union的使用(取int数据类型的各个字节)

相同类型的数据集合在一起可以用数组;--->每个成员占用不同的内存空间

不同类型的数据集合在一起可以用结构体;--->每个成员占用不同的内存空间

不同类型的数据放在同一段内存单元上,使用共用体。--->每个成员占用同一段的内存空间----->省内存空间

例如:结构体

struct student{

char name[10];

int age;

float length;

};

共用体:

union student{

char name[10];

int age;

float length;

};

共用体所占内存字节数与其成员中占字节数最多的那个成员相等。

共用体变量不能进行初始化;

只能对成员进行单独赋值:

union student  stt;

stt.age = 19;

stt.length = 1.76;

printf("%d",stt.age);------------------->最后的值,是length成员的值,故会将1.76 取整,

共用体只能引用共用体变量的成员。有三种形式:

共用体变量名.成员名

共用体指针->成员名

(*共用体指针).成员名

共用体变量中起作用的是最近一次存入的成员变量的值,原有的成员变量的值将被覆盖。

例如:

利用共用体取出int变量的高字节和低字节的数据

union student{
int a;
char ch[2];
}stt;

stt.a=0x4321;

printf("%x,%x",stt.ch[0],stt.ch[1]); //分别对应21 43

通信中的数据包会用到共用体。
因为不知道对方会发一个什么包过来,用共用体的话就很简单了,定义几种格式的包,收到包之后就可以直接根据包的格式取出数据。

总结:数据类型为int和char[]的形式,可以将赋值的int值的各个字节通过char数组取出来,这种方式在串口通信中经常使用。

例1:

union student{
unsigned int a;
unsigned char c;
}stt;

stt.c='A';

printf("%c",stt.a); //输出时A
//一个字节,放在低位。

参考字节序的转换https://blog.csdn.net/modi000/article/details/108484846 

例2:我们经常使用共用体来获取一个int数据类型的中的各个字节

typedef struct{

uint32_t aa:8;
uint32_t bb:8;
uint32_t cc:8;
uint32_t dd:8;

}STRTEST;

uinon MYUNION{
STRTEST str;
uint32_t value;

};


uinon MYUNION  mm;
//1)为 uint32_t数据类型赋值,取各个字节的数;
mm.value = 0x12345678;
mm.str.aa = 0x78;
mm.str.bb = 0x56;
mm.str.cc = 0x34;
mm.str.dd = 0x12;

//2)给各个字节赋值,取uint32_t的值---->按照小端序的话,是如下的value

mm.str.aa = 0x78;
mm.str.bb = 0x56;
mm.str.cc = 0x34;
mm.str.dd = 0x12;
mm.value = 0x12345678;

 

 

 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值