11

也许我没有正确理解 C++ 或者它是编译器的错误?

uint8_t a = 0x00;
uint8_t b = 0xFF;

if( a - b == 1 )
{
    doNothing();
}

doNothing 没有被调用(如预期的那样),因为 (ab) 的结果在比较操作中被隐式转换为第二个操作数的类型。对于数字,它是带符号的 int。好的。

if( a - b == (uint8_t)1 )
{
    doNothing();
}

doNothing 仍然没有被调用,但现在我不明白它的原因!我已经明确地将数字转换为 uint8!

if( (uint8_t)(a - b) == 1 )
{
    doNothing();
}

现在 doNothing 终于被调用了,但又是为什么?两个uint8的减法如何返回一个int?

编译器是用于 ARM Cortex M3 的 uVision ARMCC。

4

3 回答 3

12

a - b中,操作数在减法之前被提升int,所以结果是 -255,而不是 1。

这就是第一个和第二个例子都失败的原因。它与 的另一个操作数无关==。第三个将 -255 转换回 ,以uint8_t256 为模减少它,因此结果如预期的那样为 1。

于 2013-09-26T17:37:40.200 回答
2

好吧,我在数学和十六进制方面都不是最好的,但似乎是这样a = 0b = 255所以它等于 -255 而不是 1。

于 2013-09-26T17:37:39.950 回答
1

ARM Cortex M3 是一个 32 位处理器。所以 a - b 的结果是 0xFFFFFF01 不等于 1(1 ==> 32 位表示中的 0x00000001)所以不调用 doNothing() 函数!

在情况 2 中,如果将 1 类型转换为 uint8_t,即 0xFFFFFF01 不等于 0x01,则不会再次调用 doNothing() 函数!

在情况 3 中,当您将 a - b 输出类型转换为 uint8_t 时, a - b 结果为 0x01,等于 1,因此会调用 doNothing。

于 2013-09-26T17:57:56.280 回答