一、总结
1.共用体表示几个变量共用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量。
在union中,所有的共用体成员共用一个空间,并且同一时间只能储存其中一个成员变量的值。
2.当一个共用体被声明时, 编译程序自动地产生一个变量, 其长度为联合中类型字节数最多的变量的类型长度的整数倍。
typedef union{/*“共用”类型“FOO”*/
char s[10]; /*“字符”类型的数组“S”下面有“10”个元素*/
int i; /*“整数”类型i*/
}foo;
foo中字节最多是类型是int ,sizeof(int)=4 ,整数倍 4*3=12 >char s[10] 的10;所以 sizeof(foo)=12
二、代码举例
#include <stdio.h>
#include <stdint.h>
#include <unistd.h>
typedef union{
char a;
int b;
int c;
}data_union;
typedef union{/*“共用”类型“FOO”*/
char s[10]; /*“字符”类型的数组“S”下面有“10”个元素*/
int i; /*“整数”类型i*/
}foo;
int main()
{
data_union u1;
u1.a = 'H';
u1.b = 10;
u1.c = 20;
data_union u2;
u2.b = 10;
u2.c = 20;
u2.a = 'H';//H 72
printf("u1 size:%d\n",sizeof(u1));//u1 size:4
printf("foo size:%d\n",sizeof(foo));//foo size:12
printf("u1.a:%d u1.b:%d u1.c:%d\n",u1.a,u1.b,u1.c);//u1.a:20 u1.b:20 u1.c:20
printf("u2.a:%d u2.b:%d u2.c:%d\n",u2.a,u2.b,u2.c);//u2.a:72 u2.b:72 u2.c:72
return 0;
}
2.通风柜项目中类似的代码
#include <stdio.h>
#include <stdint.h>
#include <unistd.h>
#if !defined(__PACKED)
#define __PACKED
#endif
typedef union
{
uint16_t Val;
uint8_t v[2] __PACKED;
struct __PACKED
{
uint8_t LB;
uint8_t HB;
} byte;
struct __PACKED
{
uint8_t b0:1;
uint8_t b1:1;
uint8_t b2:1;
uint8_t b3:1;
uint8_t b4:1;
uint8_t b5:1;
uint8_t b6:1;
uint8_t b7:1;
uint8_t b8:1;
uint8_t b9:1;
uint8_t b10:1;
uint8_t b11:1;
uint8_t b12:1;
uint8_t b13:1;
uint8_t b14:1;
uint8_t b15:1;
} bits;
} WORD_VAL, WORD_BITS;
int main()
{
WORD_VAL EEP_Status;
EEP_Status.v[0] = 0x34;
EEP_Status.v[1] = 0x12;
printf("EEP_Status:%d\n",EEP_Status.Val);//4660 0x1234
printf("EEP_Status:%d\n",EEP_Status.bits.b2);//1
printf("EEP_Status:%d\n",EEP_Status.bits.b3);//0
printf("EEP_Status:%d\n",EEP_Status.bits.b4);//1
WORD_VAL EEP_Status2;
EEP_Status2.Val=0x1234;
printf("EEP_Status2:%d\n",EEP_Status2.v[0]);//52 0x34
printf("EEP_Status2:%d\n",EEP_Status2.v[1]);//18 0x12
return 0;
}
标签:EEP,Status,union,u1,uint8,u2,printf,共用
From: https://www.cnblogs.com/ike_li/p/17685362.html