也许我不正确理解C++或者它是编译器的错误?
uint8_t a = 0x00;
uint8_t b = 0xFF;
if( a - b == 1 )
{
doNothing();
}
Run Code Online (Sandbox Code Playgroud)
doNothing未被调用(如预期的那样),因为(ab)的结果在比较操作中被隐式地转换为第二个操作数的类型.对于数字,它是签名int.好的.
if( a - b == (uint8_t)1 )
{
doNothing();
}
Run Code Online (Sandbox Code Playgroud)
doNothing STILL没有被调用,但现在我不明白它的原因!我已经明确地将数字转换为uint8!
if( (uint8_t)(a - b) == 1 )
{
doNothing();
}
Run Code Online (Sandbox Code Playgroud)
现在doNothing终于被召唤了,但为什么呢?如何减去两个uint8返回一个int?
编译器是用于ARM Cortex M3的uVision ARMCC.
Mik*_*our 11
在a - b,操作数被提升到int减法之前,因此结果是-255,而不是1.
这就是为什么第一个和第二个例子都失败了; 它与其他操作数无关==.第三个转换为-255 uint8_t,将模数减少到256,因此结果为1,如预期的那样.