union共用体

发布时间 2023-09-07 16:40:02作者: ike_li

一、总结

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

    return 0;
}