锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

C语言关键字之“union”

时间:2024-04-24 13:07:11

union 关键字
其一:在union的所有数据成员中,同一时间只能存储一个数据成员。所有数据成员具有相同的地址,其空间的大小,以最大数据成员为准。eg:

union StateMachine
{
char character;
int number;
char *str;
double exp;
};

一个union只能设置一个足够大的空间来存储一个最大长度的数据成员,对于上述的例子而言:最大的长度为double型,所以StateMachine的空间大小就是double数据类型的大小。

其二:大小端对union数据类型的影响
eg.
unon
{
int i;
char a[2];
};*p.u
p=&u;
p->a[0]=0x39;
p->a[1]=0x38;
p.i的值应该为多少?
这里需要考虑存储的模式:大端和小端
大端模式( Big_endian ):字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。
小端模式(Little_endian):字数据的 高字节存储在高地址中,而字数据的低字节则存放在低地址中。
union 型数据所占的空间等于其最大的成员所占的空间。对union 型的成员的存取都是相对于该联合体基地址的偏移量为0 处开始,也就是联合体的访问不论对哪个变量的存取都是从union 的首地址位置开始。由此可以看出p.i的值应为0x39.

其三:如何确认当前系统的存储模式
请写一个C 函数,若处理器是Big_endian 的,则返回0;若是Little_endian 的,则返回1。
以大端模式存储,其内存布局如下图:

以小端模式存储,其内存布局如下图:

变量i 占4 个字节,但只有一个字节的值为1,另外三个字节的值都为0。如果取出低
地址上的值为0,毫无疑问,这是大端模式;如果取出低地址上的值为1,毫无疑问,这是
小端模式
程序如下:
int checkSystem( )
{
union check
{
int i;
char ch;
} c;
c.i = 1;
return (c.ch ==1);
}
不过要说明的一点是,某些系统可能同时支持这两种存储模式,你可以用硬件跳线或在编译器的选项中设置其存储模式。
-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章