C/C++:[4]如何使用共用体(union)
1、共用体的语法和结构体的类似,共用体声明格式如下:
union uninType
{
int fourByte;
char oneByte[4];
};
2、定义结构后,就可以创建这种类型的变量了:
uninType Test1;
uninType Test2;
等
1、假如有定义:
uninType Test;
test.fourByte=2;
则
cout << (int)test.oneByte[0] << endl;
会输出显示什么?这里涉及到存储大小端模式的问题,答案见步骤2
2、有如下代码:
test.fourByte=2;
cout << (int)test.oneByte[0] << endl;
if (test.oneByte[0] == 2)
cout << "Little endian!" << endl;
else
cout << "Big endian!" << endl;
这个代码能测试CPU的大小端模式,我使用Intel CORE i3,win7 OS得到输出如下:
2
Little endian!
![C/C++:[4]如何使用共用体(union)](https://exp-picture.cdn.bcebos.com/3fc72e486143d7d4fc24145f7da75f0f832b50a9.jpg)
1、在嵌入式系统开发中,有时需要将一些变量存储在EEPROM中,变量类型若是char、int就很好办,可是如果要存储float、double类型的变量怎么办呢?
这个问题可以用共用体解决:
union myfloat
{
char i[4];
float j;
}Test;
因为float是四个字节,因此我们定义一个4个元素的char数组和float公用一段内存,接下来就是EEPROM存取了
2、在程序中要使用 j 的地方使用Test.j就行了,
想把 j 存入EEPROM可以这样:
EEPROM_WRITE(0,myfloat.i[0]);
EEPROM_WRITE(1,myfloat.i[1]);
EEPROM_WRITE(2,myfloat.i[2]);
EEPROM_WRITE(3,myfloat.i[3]);
注:上面参数0、1、2、3为EEPROM地址,上面的EEPROM_WRITE只是示意,有时需要对地址使用(void*)进行类型转换
3、想把 j 从EEPROM读出可以这样:
myfloat.i[0]=EEPROM_READ(0);
myfloat.i[1]=EEPROM_READ(1);
myfloat.i[2]=EEPROM_READ(2);
myfloat.i[3]=EEPROM_READ(3);
然后在程序中继续使用Test.j就可以了
是不是很简单呢