联合体一站式教学(内含联合体的介绍,应用实例,联合体大小比较原则和方法,以及为什么要用联合体)----用两种方法判断当前计算机的大小端

简介: 联合体一站式教学(内含联合体的介绍,应用实例,联合体大小比较原则和方法,以及为什么要用联合体)----用两种方法判断当前计算机的大小端
#define _CRT_SECURE_NO_WARNINGS 1 
#include<stdio.h>
//联合体/共用体--------共用一块空间,空间至少是最大成员的大小
//联合体是一种特殊的自定义类型,这种类型定义的变量包含一系列的成员,特征是这些成员共用一块空间
//union  un//创建联合体类型
//{
//    char c;//1
//    int i;//4
//};
//int main()
//{
//    union un u={10};//同一时间,联合体成员只能改其中的一个值
//    u.i = 1000;//u.i和u.c只能有一个有效,因为共用一个空间
//    u.c = 100;
//    printf("%d\n", sizeof(u));//4
//    printf("%p\n", &u);//000000176572F8F4
//    printf("%p\n", &(u.c));//000000176572F8F4
//    printf("%p\n", &(u.i));//000000176572F8F4
//    return 0;
//}
//判断当前计算机的大小端
//int check_sys()和check_sys2()是两种实现方法
//法一:
int check_sys()//使用函数,并不进行打印,用返回值确定是大端还是小端,使之更加灵活
{
    int a = 0x11223344;//a是int型,4个字节,,0x11223344是十六进制,也是4个字节
//44是低位,11是高位,   在内存中,如果由低地址到高地址为11223344,则低位放在高地址,是大端存储
//                              如果由低地址到高地址为44332211,则低位放在低地址,是小端存储
    if ((*(char*)&a) = 4)//&a拿出地址,(char*)强制类型转换为char,*解引用.目的是拿出前两个字节
    {
        return 1;//小端
    }
    else
    {
        return 0;//大端
    }
}
//法二:
int check_sys2()
{
    union U
    {
        char c;
        int i;
    }u;//在联合体里面创建个变量u
    u.i = 1;
    return u.c;//目的:在联合体 c i共用一个空间,而char正好是int的前四分之一部分,所以可以判断
}
int main()
{
    int ret=check_sys();//写函数的目的是让其更加独立!
    if (ret == 1)
        printf("小端\n");//小端---对照check_sys()
    else
        printf("大端\n");
    int check_sys2();
        if (ret == 1)
            printf("小端\n");//小端----对照check_sys2();
        else
            printf("大端\n");
    return 0;
}
//使用场景举例:学校里有老师和同学,老师同学都有性别,身高,爱好,职务等,
//那么如何区分老师学生呢,此时用联合体,并把联合体放在第一个,其他放后,就能区分
//联合体大小的计算
//空间至少是最大成员的大小,当最大成员大小不是最大对齐数的整数倍的时候,
//就要对齐到最大对齐数的整数倍
union Un
{
    char a[5];//1----5
    int i;//4----必须是最大对齐数4的倍数,且大于5,就是8
};
union Vn
{
    short a[5];//2----10
    int i;//4----必须是最大对齐数4的倍数,且大于10,就是12
};
int main()
{
    union Un u;
    printf("%d\n", sizeof(u));//8
    union Vn v;
    printf("%d\n", sizeof(v));//12
    return 0;
}

cfefa34411cf407caf234ee0cde4fc0c.png

相关文章
|
编译器
自定义类型:结构体2.0(初阶+进阶)+位段+枚举+联合(上)
自定义类型:结构体2.0(初阶+进阶)+位段+枚举+联合(上)
|
编译器 Linux C语言
【C语言航路】第十二站:自定义类型:结构体、枚举、联合体
【C语言航路】第十二站:自定义类型:结构体、枚举、联合体
60 0
|
存储 编译器 C语言
【C语言航路】第十站:指针(三)深刻理解指针运算
【C语言航路】第十站:指针(三)深刻理解指针运算
50 0
|
人工智能 编译器 测试技术
一次性搞清数组指针、指针数组---从多维数组的本质上刨析(让你顿悟版)
一次性搞清数组指针、指针数组---从多维数组的本质上刨析(让你顿悟版)
43 0
|
存储
自定义类型:结构体2.0(初阶+进阶)+位段+枚举+联合(中)
自定义类型:结构体2.0(初阶+进阶)+位段+枚举+联合(中)
|
存储 编译器
自定义类型:结构体2.0(初阶+进阶)+位段+枚举+联合(下)
自定义类型:结构体2.0(初阶+进阶)+位段+枚举+联合(下)
|
存储 C语言 C++
【C语言进阶篇】一篇文章让你彻底拿下 位段 枚举 联合!(上)
【C语言进阶篇】一篇文章让你彻底拿下 位段 枚举 联合!(上)
73 1
|
存储 编译器 Linux
【C语言进阶篇】一篇文章让你彻底拿下 位段 枚举 联合!(下)
【C语言进阶篇】一篇文章让你彻底拿下 位段 枚举 联合!(下)
79 0
|
C语言
【c语言进阶】三分钟教会你终极套娃:指向函数指针数组的指针,让你真正理解如何解读一个变量的类型
【c语言进阶】三分钟教会你终极套娃:指向函数指针数组的指针,让你真正理解如何解读一个变量的类型
100 0
|
存储 算法 编译器
【C语言进阶】结构体、位段、枚举、以及联合(共用体)的相关原理与使用(下)
【C语言进阶】结构体、位段、枚举、以及联合(共用体)的相关原理与使用(下)