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

本文介绍了C语言中的联合体(共用体)特性,讲解了如何利用联合体来理解不同数据类型在内存中的共享空间。同时,通过两个函数check_sys()和check_sys2()演示了如何判断计算机的大小端存储方式。此外,还讨论了联合体在存储空间计算中的规则,以及在实际问题中的应用,如区分老师和学生的例子。最后,展示了两个实例,计算了不同联合体类型的大小。
摘要由CSDN通过智能技术生成

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力成为焦耳定律鸭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值