打印
[STM32F1]

关于MDK中开发STM32遇到的一个奇怪的现象

[复制链接]
1190|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qq609048002|  楼主 | 2014-11-25 20:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在使用MDK编写STM32程序的时候发现了一个奇怪的现象,也可能是我不大了解MDK编译器。
我在定义了两个16位变量 a和b
unsigned short a,b;
c是一个宏   #define  c   20
在if( (a-b)>c )这个判断语句中居然a-b变成了一个signed short型的,会出现负数,当我加强制类型转换if( (unsigned short)(a-b)>c )才会正常,我以前在MPLAB中都是不用加强制类型转换的,百度半天无果。。。请各位大神指教~~


沙发
styleno1| | 2014-11-25 21:32 | 只看该作者
The integer promotions are performed on the operand, and the result has the promoted type.


减法操作会有类型提升。

使用特权

评论回复
板凳
qq609048002|  楼主 | 2014-11-25 21:54 | 只看该作者
styleno1 发表于 2014-11-25 21:32
减法操作会有类型提升。

就是说编译器的确帮我把结果偷偷转换成带符号的类型了?

使用特权

评论回复
评论
styleno1 2014-11-25 23:17 回复TA
什么“偷偷”,这是规则。 
地板
aozima| | 2014-11-25 21:57 | 只看该作者
主要是你变量c没有指明类型,就会使用默认类型int

使用特权

评论回复
5
qq609048002|  楼主 | 2014-11-25 22:16 | 只看该作者
aozima 发表于 2014-11-25 21:57
主要是你变量c没有指明类型,就会使用默认类型int

我把c改成#define  c   (unsigned short)20 后还是没用

使用特权

评论回复
6
diweo| | 2014-11-25 22:33 | 只看该作者
那就别用减法了.用if(a>b+c)

使用特权

评论回复
7
kseeker| | 2014-11-26 00:06 | 只看该作者
本帖最后由 kseeker 于 2014-11-26 00:09 编辑
qq609048002 发表于 2014-11-25 22:16
我把c改成#define  c   (unsigned short)20 后还是没用

a-b的结果不是signed short,而是signed int,32位的。指定c为unsigned是没用的,因为c之后还是会被转为int再和a-b的结果比较。(uint16_t)(a - b) > c之所以能工作,是因为a-b从int转为uint16_t的时候会被直接截断,
截断的结果再作为int和c比较。
按照C的规则,所有比int范围小的数都是转换为int才进行运算的(除非编译器能确定不提升也能保证相同的结果)。正常编译器都应该是这样的,只是单片机的编译器有时候为了效率没法严格按照规则办。
其实想想吧,如果你看见这样语句:
a = 3; b = 5;
a - b = -2 < 20
才是正常的想法。

使用特权

评论回复
8
qq609048002|  楼主 | 2014-11-26 08:44 | 只看该作者
kseeker 发表于 2014-11-26 00:06
a-b的结果不是signed short,而是signed int,32位的。指定c为unsigned是没用的,因为c之后还是会被转为int ...

谢谢,这次彻底明白了

使用特权

评论回复
9
chenyongand| | 2014-11-28 11:59 | 只看该作者
编译的时候,有个中间变量,用来保存a-b的值,这个中间变量,在编译器里默认是int类型的,32位

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

140

帖子

1

粉丝