你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【没准我火星了】union的使用及一个缺陷

[复制链接]
amet 发布时间:2015-11-11 21:25
不知道大家在写程序的时候用不用union,之前我只拿来当前后相关性非常强的define来用,有时也和书上一样,存储绝对不会一起出现的值。
之前看M4的SIMD指令时发现很多操作涉及到数据的封装,把两个16位数值放到一个32位变量的高位和低位里。开始的想法是写个16位数组然后强制类型转换为32位读出。后来看了《C专家编程》,发现可以这么写

  1. union simdq{
  2.     int32_t data;
  3.     int16_t dbyte[2];
复制代码
以下是PC测试程序(同时给2个数乘2,我随便想的一个),也通过32试验
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. int
  4. main(int argc,char * argv[]){
  5.     union simdq{
  6.         int32_t data;
  7.         int16_t dbyte[2];
  8.     }test;
  9.     test.dbyte[0]=1234;
  10.     test.dbyte[1]=-5678;
  11.     printf("test.dbyte[0]= %x\ntest.dbyte[1]= %x\n",test.dbyte[0],test.dbyte[1]);
  12.     printf("test.data    = %x\n",test.data);
  13.     test.data*=2;
  14.     printf("test.dbyte[0]= %x\ntest.dbyte[1]= %x\n",test.dbyte[0],test.dbyte[1]);
  15.     printf("test.data    = %x\n",test.data);
  16.     return 0;
  17. }
复制代码
返回
  1. test.dbyte[0]= 1234
  2. test.dbyte[1]= -5678
  3. test.data    = -372112174
  4. test.dbyte[0]= 2468
  5. test.dbyte[1]= -11356
  6. test.data    = -744224348
复制代码

如果使用16进制,则需要把类型改成 unsigned int ,否则若最高一位为1,读取值会自动扩展(用printf和%x看起来似乎是这样(而且无法通过强制类型转换解决(例如dbyte[1]=0xFFFFACF0(期望值应该是0xACF0(非常诡异(希望高手解答(也是和大家交流分享知识)))))))

MCU:STM32F401 + Keil v5
PC   :Intel core     + clang 3.7.0

收藏 1 评论5 发布时间:2015-11-11 21:25

举报

5个回答
zhoupxa 回答时间:2015-11-12 09:25:35
一点都不诡异,要想用union实现16位操作对32位数的MSW和LSW的存取,只能用16位无符号数,如此定义:
uint16_t  dword[2];
int32_t    data;
me浩 回答时间:2015-11-12 09:25:36
顶顶顶顶
amet 回答时间:2015-11-12 10:24:12
zhoupxa 发表于 2015-11-12 09:25
一点都不诡异,要想用union实现16位操作对32位数的MSW和LSW的存取,只能用16位无符号数,如此定义:
uint16 ...

受教了,那我使用16位负数的时候是否会存在相应的风险
yanhaijian 回答时间:2015-11-12 10:30:48
是的,这里面涉及到对齐的问题。
aabird 回答时间:2015-11-12 10:35:19
这个想法很好,但是我从来没有这方面的想法

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版