wang479871 发表于 2018-10-18 17:28:12

if比较大小,不转换类型,会影响其它不相干的变量计算

在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



sincomaster 发表于 2018-10-19 01:10:51








进行数据类型强转后,汇编直接进行比较(CPW x,#0xFDE9)

而进行常数比较,命令就变成了(CALL C_UITOLX),cosmic进行了隐性数据类型转换,具体怎么转换看上面的文档,
转换ui类型为long,存到long寄存器.
我查limits.h,ui为双字节,long 为4字节

wang479871 发表于 2018-10-19 08:21:17

sincomaster 发表于 2018-10-19 01:10
进行数据类型强转后,汇编直接进行比较(CPW x,#0xFDE9)

而进行常数比较,命令就变成了(CALL C_UITOLX ...



奇怪的是,为什么少10倍,直接比较6500,编译器却没有“隐性数据类型转换”,6500和65000不都是u16范围内吗?

wang479871 发表于 2018-10-19 08:34:00

sincomaster 发表于 2018-10-19 01:10
进行数据类型强转后,汇编直接进行比较(CPW x,#0xFDE9)

而进行常数比较,命令就变成了(CALL C_UITOLX ...

请问您这个汇编截图,是帮助文件?还是什么PDF手册?

wang479871 发表于 2018-10-19 08:56:10

sincomaster 发表于 2018-10-19 01:10
进行数据类型强转后,汇编直接进行比较(CPW x,#0xFDE9)

而进行常数比较,命令就变成了(CALL C_UITOLX ...





经过您的提醒后,我试了下,只要比较大小的数大于32767(即#define INT_MAX   32767),

编译器就会进行“c_uitolx”转换。

我有个疑问:我在程序里用了很多if比较,比如:
if (Metering.Flow > 9999999)还没有出现问题,
现在心里有点怕,有没有必要把程序里全部所有的数字都写上 u16强制转换?

馒头弟 发表于 2018-10-19 09:50:12

我按照你的定义试了一下,没出现Flow改变的问题,,,你的编译优化等级是多少

sincomaster 发表于 2018-10-19 09:50:57

if (Metering.Flow > 9999999)还没有出现问题,
这个没出问题正常啊,因为你的FLOW是U32类型,你的9999999还没超过long类型的2147483647
因为都是long类型,一个有符号一个无符号,( 这样我不清楚会不会转换)
但U32最大是4294967295,只是你现在是9999999还没超过long类型的2147483647,超过会有问题,你可以试下超过这个数

sincomaster 发表于 2018-10-19 09:52:45

wang479871 发表于 2018-10-19 08:34
请问您这个汇编截图,是帮助文件?还是什么PDF手册?

汇编图片是用你的,我没试,只是按你的图给你回复,那个文档是COSMIC的使用手册查的相关指令

sincomaster 发表于 2018-10-19 09:55:23

经过您的提醒后,我试了下,只要比较大小的数大于32767(即#define INT_MAX   32767),
还有你说的这个问题,就和我上面回你的
(但U32最大是4294967295,只是你现在是9999999还没超过long类型的2147483647,超过会有问题,你可以试下超过这个数)
这个是一个意思,32767刚好没超过有符号整型的正数上限,所以不转换,超过就转换

wang479871 发表于 2018-10-19 11:07:50

馒头弟 发表于 2018-10-19 09:50
我按照你的定义试了一下,没出现Flow改变的问题,,,你的编译优化等级是多少 ...



为了便于描述问题,我特意简化,其实程序里是有很多的,
页: [1] 2
查看完整版本: if比较大小,不转换类型,会影响其它不相干的变量计算