[牛人杂谈] 联合(union)与枚举(enum)

[复制链接]
1071|8
 楼主| huangcunxiake 发表于 2016-4-30 22:29 | 显示全部楼层 |阅读模式
ni, IO, Mount, TI, tc
联合联合和结构的区别是,结构会为每个字段申请一片内存空间,而联合只是申请了一片内存空间然后所有字段都会保存到这片空间中,这片空间的大小由字段中最长的决定,下面我们就开始定义一个联合
1 //联合的定义2 typedef union{3     short count;4     float weight;5     float volume;6 } quantity;联合的使用 我们可以通过很多的方式为联合赋值
  1. typedef struct{
  2.     const char* color;
  3.     quantity amount;
  4. }bike;

  5. int main(){
  6.     //用联合表示自行车的数量
  7.      bike b={"red",5};
  8.      printf("bike color:%s count:%i\n",b.color,b.amount.count);
  9.      //用联合表示自行车的重量
  10.      bike b2={"red",.amount.weight=10.5};
  11.      printf("bike color:%s count:%f\n",b2.color,b2.amount.weight);
  12.     return 0;
  13. }



 楼主| huangcunxiake 发表于 2016-4-30 22:30 | 显示全部楼层
但是在读取联合的值的时候会很容易出问题,比如我们保存了一个float类型的字段,但通过short字段读取,得到了与预期毫不相干的值

download.png

 楼主| huangcunxiake 发表于 2016-4-30 22:31 | 显示全部楼层
枚举为了避免像联合哪样把字段的数据类型搞混乱,我们可以使用枚举
  1. #include <stdio.h>

  2. //枚举的定义和结构很类似
  3. typedef enum colors{RED,BLACK,BLUE,GREEN} colors;

  4. int main(){
  5.     colors favorite=BLUE;
  6.     printf("%i",favorite);
  7.     return 0;
  8. }
如果想要保存多种数据类型l联合毕枚举更适用,那么要保存多条数据的话枚举比联合更适合

mintspring 发表于 2016-4-30 23:12 | 显示全部楼层
不知道联合这个东西可以混合浮点型和整形数据吗,我知道全部是整形的数据是很没问题的。
mintspring 发表于 2016-5-5 14:39 | 显示全部楼层
zyj9490 发表于 2016-4-30 23:56
可以的,以最大字节的变量分配内存单元。

以前都不敢这么用,担心小数部分是怎么存的。
zyj9490 发表于 2016-5-5 15:21 | 显示全部楼层

754

本帖最后由 zyj9490 于 2016-5-5 15:23 编辑
mintspring 发表于 2016-5-5 14:39
以前都不敢这么用,担心小数部分是怎么存的。

联合原本是为了节省几个内存字节,现在有人在用转换功能。这就要注意的部分。浮点是按754格式存的。(大端模式)
mintspring 发表于 2016-5-5 19:40 | 显示全部楼层
zyj9490 发表于 2016-5-5 15:21
联合原本是为了节省几个内存字节,现在有人在用转换功能。这就要注意的部分。浮点是按754格式存的。(大端 ...

非常感谢,以前真不知道754这个东西。转换格式是真的,特别那个ADC转换的数据的精度保存问题,可以高八位也可以低八位。就是用这个实现非常方便。要不还要计算,非常麻烦。
 楼主| huangcunxiake 发表于 2016-5-6 15:13 | 显示全部楼层
大家有没有觉得枚举类型有点像 宏定义啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

223

主题

3745

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部