也许我不明白C是否是编译器的错误?
uint8_t a = 0x00; uint8_t b = 0xFF; if( a - b == 1 ) { doNothing(); }
doNothing不被调用(如预期的),因为(a-b)的结果在比较操作中被隐式转换为第二个操作数的类型.而对于数字,它是int int.好的.
if( a - b == (uint8_t)1 ) { doNothing(); }
doNothing STILL不被调用,但现在我不明白它的原因!我明确地将号码转载给uint8!
if( (uint8_t)(a - b) == 1 ) { doNothing(); }
现在doNothing终于被叫了,但又是为什么?如何减去两个uint8返回一个int?
编译器是用于ARM Cortex M3的uVision ARMCC.
解决方法
在a-b中,操作数在减法之前被提升为int,因此结果为-255,而不是1.
这就是为什么第一个和第二个例子都失败了它与==的其他操作数无关.第三个将-255转换回uint8_t,将其减少为模256,因此结果为预期的1.