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
才是正常的想法。