资讯详情

C语言关键字之“union”

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百科大全!

锐单商城 - 一站式电子元器件采购平台