将uint8_t与数字进行比较

Amo*_*mum 10 c c++ keil

也许我不正确理解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,如预期的那样.