|
在STVD里,编写STM8L052单片机程序, 我在头文件里面是这样定义的: typedef struct { u32 Flow; u16 SetDelaySec; SType_SaveData SaveData; }SType_Metering; 调试的时候,无意中发现: if(Metering.SetDelaySec>65000) 会影响其它函数里面不相干的变量Metering.Flow,即Metering.SetDelaySec与Metering.Flow是完全不相干的。 只有进行转换if(Metering.SetDelaySec>(u16)65000) ,程序才能够正常运行。 然后查看编译器生成的汇编如下:
无转换
完全是不一样的, 有前辈知道原因吗? 恳请赐教。 (另外有个问题,我目前程序里if (Metering.Flow > 9999999)还没有出现问题,现在心里有点怕,不知道要不要把所有的if比较,全部都进行转换) 2018年10月18日17:27:34 |
微信公众号
手机版
进行数据类型强转后,汇编直接进行比较(CPW x,#0xFDE9)
而进行常数比较,命令就变成了(CALL C_UITOLX),cosmic进行了隐性数据类型转换,具体怎么转换看上面的文档,
转换ui类型为long,存到long寄存器.
我查limits.h,ui为双字节,long 为4字节
评分
查看全部评分
奇怪的是,为什么少10倍,直接比较6500,编译器却没有“隐性数据类型转换”,6500和65000不都是u16范围内吗?
请问您这个汇编截图,是帮助文件?还是什么PDF手册?
经过您的提醒后,我试了下,只要比较大小的数大于32767(即#define INT_MAX 32767),
编译器就会进行“c_uitolx”转换。
我有个疑问:我在程序里用了很多if比较,比如:
if (Metering.Flow > 9999999)还没有出现问题,
现在心里有点怕,有没有必要把程序里全部所有的数字都写上 u16强制转换?
评分
查看全部评分
这个没出问题正常啊,因为你的FLOW是U32类型,你的9999999还没超过long类型的2147483647
因为都是long类型,一个有符号一个无符号,( 这样我不清楚会不会转换)
但U32最大是4294967295,只是你现在是9999999还没超过long类型的2147483647,超过会有问题,你可以试下超过这个数
评分
查看全部评分
汇编图片是用你的,我没试,只是按你的图给你回复,那个文档是COSMIC的使用手册查的相关指令
还有你说的这个问题,就和我上面回你的
(但U32最大是4294967295,只是你现在是9999999还没超过long类型的2147483647,超过会有问题,你可以试下超过这个数)
这个是一个意思,32767刚好没超过有符号整型的正数上限,所以不转换,超过就转换
为了便于描述问题,我特意简化,其实程序里是有很多的,