C语言 联合体 机器大小端

联合(共用体)

联合类型的定义

在这里插入图片描述
代码解释如下

struct  enum
union Un  //联合体定义联合体类型的时候的关键字。un是自定义的
{
	char c;//1   这放联合体或共用体成员
	int i;//4
};

int main()
{
	union Un u //用上面的类型在这里创建的变量


	printf("%p\n", &u); 
	printf("%p\n", &(u.c));
	printf("%p\n", &(u.i));//打印出这三个地址是一样的

	//printf("%d\n", sizeof(u));//占用内存空间4个字节.为什么是4  因为i c共用了一块空间

	return 0;
}

联合的特点

在这里插入图片描述
代码解释同上

struct  enum
union Un  //联合体定义联合体类型的时候的关键字。un是自定义的
{
	char c;//1   这放联合体或共用体成员
	int i;//4
};

int main()
{
	union Un u = {10};//联合体初始化 是共同初始化 两个都变10  
	u.i = 1000;//单独初始化  这个相当于4个字节存1000个元素
	u.c = 100;// 相当于第一个放100个元素

	printf("%p\n", &u); 
	printf("%p\n", &(u.c));
	printf("%p\n", &(u.i));//打印出这三个地址是一样的

	//printf("%d\n", sizeof(u));//占用内存空间4个字节.为什么是4  因为i c共用了一块空间

	return 0;
}//联合体是在多个成员想让他们共同享有其中某一块空间的时候就用联合体

判断当前计算机大小端

如果是1则表示小端;如果是0,则是大端。

在这里插入图片描述

int main()//判断当前机器大小端
{
	int a = 1;
	if ((*(char*)&a) == 1)//&a其实就是起始位置的地址 他是整型变量int*所以强制类型转换 在解引用拿到一个字节
	{
		printf("小端");
	}
	else
	{
		printf("大端");

	}

	return 0;
}

int check_sys()
{
	int a = 1;
	if ((*(char*)&a) == 1)
	{
		return 1;//小端
	}
	else
	{
		return 0;//大端
	}
}

int main()
{
	int ret = check_sys();
	if (ret == 1)
		printf("小端\n");
	else
		printf("大端\n");

	return 0;
}

联合体实现方法如下


int check_sys()
{
	union U
	{
		char c;
		int i;  //给i放值相当于c也覆盖了
	}u;
	u.i = 1;//相当于给内存里放了个1 至于是大端还是小端看返回值
	return u.c;
	//返回1 就是小端
	//返回0 就是大端
}

int main()
{
	int ret = check_sys();
	if (ret == 1)
		printf("小端\n");
	else
		printf("大端\n");

	return 0;
}

联合大小的计算

在这里插入图片描述

union Un
{
	short s[5];// 2 10
	int a;//4
};  //结果12

union Un
{
	char a[5];//1 按1看     占5个字节  5不是4倍数所以要对齐到最大对齐数整数倍,4的倍数所以是8
	int i;//4
	char c;//1   两个char是5  两个对齐数是1 最大对齐数1 a站5个字节是最大对齐数倍数
};

int main()
{
	union Un u;
	printf("%d\n", sizeof(u));  // 4  5打印8个字节,联合体存在对齐

	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值