关于联合体输出的问题(是否小端模式)

今天刷C语言题的时候 遇到两道关于联合体输出的问题 一遍查资料一遍上机验证最后总结出一些简陋的经验;
写得比较通俗 可能有专业词汇用的不当 欢迎指正

情况一:(直接用题目数据 原理不变)(Turbo C

union
{
	unsigned char c;
	unsigned int i[4];//联合体z一共分配8个字节 z.c与z.i[0]同大小
}z;
z.i[0]=0x39;//16进制化成十进制 为57
z.i[1]=0x36;//16进制画成十进制 为54
printf("%c
",z.c);//输出z.c=9(ACSII 9对应整数57)

0011 1001 0011 0110 z.c占前面八位
----z.i[0] -------z.i[1]-----

所以这里不用考虑大小端问题 因为我们要输出的z.c的大小和z.i[0]一致 不涉及到别的字节 输出z.c就相当于输出z.i[0];

情况二:(Turbo C

union
{
	int i;
	char c[2];//联合体一共占2个字节 x.i与x.c[0]+x.c[1]同大小
}x;
x.c[0]=10;
x.c[1]=1;
printf("%d
",x.i);//输出x.i=266

0000 1010 0000 0001 x.i占整个联合体大小(16位)
----x.c[0] ------x.c[1]—

所以这里就会发生小端的现象 就是我们要求输出 x.i 时,x.i 的字节大小已经涉及到x.c[0]和x.c[1]两个部分 所以输出x.i 发生的小端模式使得最后输出:
0000 0001 0000 1010 相当于pow(2,8)+10=266
这里把x.c[1] 放前面了 是因为小端模式的特点:高字节放高地址 低字节放低地址

情况三:(C++实验)

#include<bits/stdc++.h>
using namespace std;
int main()
{
	union un 
	{//c++ short两个字节 int 四个字节
		int c;//z.c的字节数相当于z.i[0]与z.i[1]字节数的和
		short i[4];//联合体z一共占8个字节 z.c占前面4个字节
	}z;
	z.i[0]=0x1;
	z.i[1]=0x100;//转化为十进制就是256
	int ans=pow(2,24)+1;//根据理论该得到的数据 下面会解释
	cout<<z.c<<endl;//实际z.c的数据
	cout<<ans<<endl;
 	return 0;
}

这里肯定也是会发生小端的 z.c 的字节大小已经涉及到z.i[0]和z.i[1]两个部分
0000 0000 0000 0001 0000 0001 0000 0000
-----------z.i[0]=1 ------------------z.i[1]=256----
经过小端处理后 输出z.c会变成这种情况:
0000 0001 0000 0000 0000 0000 0000 0001
-----------z.i[1] -----------------------z.i[0]------
它的值应为pow(2,24)+1=16777217

notice:因为z.i[ ]属于short类型 所以每个元素都是两个字节 进行小端时 换是一起换两个字节 不是一个个字节换 !!!(应该是这样的 如果不是这样 那就会是下面这样输出)
0000 0000 0000 0001 0000 0001 0000 0000 =pow(2,16)+pow(2,8)=65792
但输出结果表示结论是正确的;

这里正确的输出是这样:
在这里插入图片描述
所以最后得出的结论就是:
对联合体某个元素 z.c 输出时:若z.c 的字节大小比后面单个元素大时 情况二和情况三这样 就要考虑小端的输出 高字节放高地址(其实就是反着拼字节再输出 先放z.i[1] 再放z.i[0]);若z.c的字节大小<=后面单个元素的字节大小时 情况一这样 就不用考虑这么多了 直接拿着z.c 所对应字节算就行了。
注意 小端换的时候 是根据z.i[ ]的字节数 而不是固定地以1个字节来换)

最后为了保证结论可靠 又做了个实验(跟情况一类似)(好像有点多余)

#include<bits/stdc++.h>
using namespace std;
int main()
{
	union un 
	{
		short c;
		short i[4];

	}z;
	z.i[0]=0x1;
	z.i[1]=0x100;
	cout<<z.c<<endl;//输出1 
 	return 0;
}
原文地址:https://www.cnblogs.com/Luweir/p/14147443.html