单片机
返回首页

C语言关键字之“union”

2015-01-16 来源:51hei

其一:在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);
}
不过要说明的一点是,某些系统可能同时支持这两种存储模式,你可以用硬件跳线或在编译器的选项中设置其存储模式。
进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 光控音效发生器电路

  • 离子检测器电路分析

  • 非常简单的150W功放电路图

  • 基于IC555的可变PWM振荡器电路

  • 使用NE555和磁簧开关的橱柜照明电路

  • 一种构建12V和230V双直流电源的简单方法

    相关电子头条文章