抖音粉丝群1
『7x24小时有问必答』

主要内容:

1、指针
2、交换浮点数高低字
有人遇到了一个问题:wincc使用modbus tcp访问的设备,其32位浮点数数据不符合标准与wincc不兼容,需要交换其高低字,问如何实现。

本文介绍一种借助变量的指针来解决的方法。下面先来复习一下C语言的指针。

1

  指针

如下,定义了一个指向整型变量的指针变量 point1
int *point1;
左端的 int 是在定义指针变量时必须指定的“基类型”。此基类型用来指定指针变量可以指向的变量类型。就是说上面定义的指针 point1,可以用来指向整型的变量,但不能指向其他类型如浮点类型变量。
int *point1;float  a;point1  =  &a;    //将float型变量的地址放到指向整型变量的指针变量中,错误。

众所周知,C语言中不同类型的数据在内存中所占用的字节是不相同的。
“基类型”会影响指针的移动和指针的运算(加、减)。

例如:point1+1(“使指针移动一个位置”或“使指针值加1”),其所代表的实际地址是point1+1*4,4是一个int类型所占的字节数。
下面是两个与指针变量相关的运算符:
〔1〕&:取地址运算符。
〔2〕*:指针运算符(或称“间接访问运算符”),取其指向的内容。
例如,&a为变量a的地址,*p为指针变量p所指向的存储单元的内容(即p所指向的变量的值)。
2

  交换浮点数高低字

借助共用体把16进制值0x70A43F9D写入浮点数a的存储区。
float a,b;unsigned int hexValue = 0x70A43F9D;

// 使用联合将uint32_t转换为floatunion {        unsigned int i;        float f;    } converter;

converter.i = hexValue;a = converter.f;
0x70A43F9D是浮点数1.23高低字调换后的值,以表示来自设备的不兼容的值。
1.png
如下:借助指针交换a高低字后的结果存入b

*((unsigned  short*)&b) = *((unsigned  short*)&a+1);*((unsigned  short*)&b+1) = *((unsigned  short*)&a);
说明:

先使用 &a 获得变量的地址(如为0x00A00001,起的4个字节,因为x86为小端存取,所以a的低字值0x3F9D存储在变量起始地址的低地址0x00A00001~0x00A00002,高字值0x70A4存储在0x00A00003~0x00A00004)。
因为a为浮点数,所以存储单元指针变量基类型必为浮点型(长度4个字节),要想获得a的高字值的地址,需要先把&a使用 unsigned short* 强制转换为基类型为短整型(长2个字节的指针,然后使用(unsigned  short*)&a+1 移动指针到下一个位置(指针移动2个字节,到0x00A00003)。然后使用 * 获得短整型的指针中的值,赋值给b的低字变量。然后再把a的低字值赋值给b的高字变量中,完成a的高低字的交换。
〔正文结束〕

---

关注公众号回复“加群”按规则加入『WINCC脚本』技术交流群。关注后在公众号菜单项可查看更多内容。

如果你有与本文相关问题可以后台发消息,欢迎点赞、分享、关注

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码