共用体union

一、共用体的特性

共用体又叫做联合体,共用体的特性如下:

1.共用体的所有成员共用一段内存空间,且所有成员的起始位置是一致的

2.共用体的值由最后赋值的成员决定

3.共用体的内存大小

  • 共用体的内存必须大于或等于 其他成员变量中最大数据类型(含数组)的大小。
  • 共用体的内存必须是最宽**++基本数据类型++** 的整数倍,如果不是,则填充字节。

二、共用体的用途1(判断大小端)

cpp 复制代码
#include <stdio.h>
union myunion {
    int a;
    char b;
};
int main()
{
    union myunion test;
    test.a = 0x12345678;        
    if (test.b == 0x78)
        printf("小端模式");
    else if (test.b == 0x12)
        printf("大端模式");    
     return 0;
}

三、共用体的用途2(给GPIO赋值)

cpp 复制代码
/* 用途2: 给成员集体赋值*/
#include <stdio.h>

struct GPIO{
	unsigned short Pin0 :1;
	unsigned short Pin1 :1;
	unsigned short Pin2 :1;
	unsigned short Pin3 :1;
	unsigned short Pin4 :1;
	unsigned short Pin5 :1;
	unsigned short Pin6 :1;
	unsigned short Pin7 :1;
	unsigned short Pin8 :1;
	unsigned short Pin9 :1;
	unsigned short Pin10 :1;
	unsigned short Pin11 :1;
	unsigned short Pin12 :1;
	unsigned short Pin13 :1;
	unsigned short Pin14 :1;
	unsigned short Pin15 :1;
};

union IODevice{
	unsigned short gpiovalue;
	struct GPIO gpiox;
};

int main()
{
	union IODevice IO;
	IO.gpiovalue=0xff;
	printf("%d\n",IO.gpiox.Pin0);
}

四、共用体的用途3

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>

#define TOTAL 4  //人员总数

struct{
    char name[20];
    int num;
    char sex;
    char profession;
    union{
        float score;
        char course[20];
    } sc;
} bodys[TOTAL];

int main(){
    int i;
    //输入人员信息
    for(i=0; i<TOTAL; i++){
        printf("Input info: ");
        scanf("%s %d %c %c", bodys[i].name, &(bodys[i].num), &(bodys[i].sex), &(bodys[i].profession));
        if(bodys[i].profession == 's'){  //如果是学生
            scanf("%f", &bodys[i].sc.score);
        }else{  //如果是老师
            scanf("%s", bodys[i].sc.course);
        }
        fflush(stdin);
    }

    //输出人员信息
    printf("\nName\t\tNum\tSex\tProfession\tScore / Course\n");
    for(i=0; i<TOTAL; i++){
        if(bodys[i].profession == 's'){  //如果是学生
            printf("%s\t%d\t%c\t%c\t\t%f\n", bodys[i].name, bodys[i].num, bodys[i].sex, bodys[i].profession, bodys[i].sc.score);
        }else{  //如果是老师
            printf("%s\t%d\t%c\t%c\t\t%s\n", bodys[i].name, bodys[i].num, bodys[i].sex, bodys[i].profession, bodys[i].sc.course);
        }
    }
    return 0;
}

五、共用体的用途4(类型转换)

cpp 复制代码
union Converter {
    int i;
    float f;
};

// 使用共用体进行类型转换
union Converter conv;
conv.f = 3.14;
int intValue = conv.i;

六、共用体的用途5(处理特定硬件寄存器)

cpp 复制代码
union Register {
    unsigned int reg;
    struct {
        unsigned int bit0: 1;
        unsigned int bit1: 1;
        unsigned int bit2: 1;
        unsigned int bit3: 1;
        unsigned int reserved: 28;
    } bits;
};
相关推荐
To_OC15 小时前
LC 1 两数之和:面试第一道必考题,暴力解法直接被面试官 pass
javascript·算法·leetcode
鱼鱼不愚与20 小时前
《原来如此 | 第01期:为什么导航软件能预测红绿灯倒计时?》
算法
复杂网络1 天前
论最小 Agent 计算机的形态
算法
kisshyshy2 天前
🍦 雪糕、食堂、火车厢:三幅漫画吃透栈、队列与链表
javascript·算法
猿人谷2 天前
不只是 CPU 阈值:STAR 如何用 GAT + Transformer 做容器级自动扩缩容?
人工智能·算法
复杂网络2 天前
Stable Diffusion 视觉大模型微调技术深度调研
算法
复杂网络2 天前
基于 Stable Diffusion 架构的视觉大模型代表性工作与原理深度解析
算法
MrZhao4002 天前
Agent Loop 如何用 Hook 扩展:权限、日志与工具拦截
算法
MrZhao4002 天前
Agent 为什么需要 Skills:别把所有知识都塞进 system prompt
算法