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

2019-12-16 22:40发布


在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)  ,程序才能够正常运行。


然后查看编译器生成的汇编如下:

转换2.png (166.8 KB, 下载次数: 0) 下载附件 2018-10-18 17:42 上传
  

  

完全是不一样的,
有前辈知道原因吗?
恳请赐教。

(另外有个问题,我目前程序里if (Metering.Flow > 9999999)还没有出现问题,现在心里有点怕,不知道要不要把所有的if比较,全部都进行转换)
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
caoxuedong
1楼-- · 2019-12-16 23:06
你用的是结构,这个应该跟对齐有直接关系,如果要确认,可以把结构换成普通变量实验一下,就知道了。
styleno1
2楼-- · 2019-12-17 01:42
8位机通常表示不了这么大的立即数,你有编译器手册吗?
huarana
3楼-- · 2019-12-17 04:23
 精彩回答 2  元偷偷看……
wang479871
4楼-- · 2019-12-17 04:26
styleno1 发表于 2018-10-18 21:42
8位机通常表示不了这么大的立即数,你有编译器手册吗?

普通变量.png (16.96 KB, 下载次数: 0)

下载附件

2018-10-19 09:56 上传


以上改成普通变量u16 testSetDelaySec,还是有问题。

我的初步结论:
STVD的编译器COSMIC,如果大于INT_MAX     32767,则要进行 ui 转换为 L ,即 c_uitolx
takashiki
5楼-- · 2019-12-17 04:34
65000是long类型(因为int放不下),那么testSetDelaySec比较要进行整型提升到long,然后GG了
写成65000u才是unsigned int类型。

一周热门 更多>