C语言笔记——关键字之“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);
}

不过要说明的一点是,某些系统可能同时支持这两种存储模式,你可以用硬件跳线或在编译器的选项中设置其存储模式。

永不止步步 发表于12-08 11:51 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67410个|学分:345377个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号