将uint8_t与数字进行比较

时间:2013-09-26 17:32:59

标签: c++ c keil

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

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

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

doNothing未被调用(如预期的那样),因为(a-b)的结果在比较操作中被隐式地转换为第二个操作数的类型。对于数字,它是签名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。

3 个答案:

答案 0 :(得分:11)

a - b中,操作数在减法之前被提升为int,因此结果是-255,而不是1.

这就是为什么第一个和第二个例子都失败了;它与==的其他操作数无关。第三个将-255转换回uint8_t,将其模数减少为256,因此结果为1,如预期的那样。

答案 1 :(得分:1)

当涉及到数学和十六进制时,我不是最好的,但似乎a = 0b = 255所以它等于-255而不是1.

答案 2 :(得分:-1)

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

在情况2中,如果你将1转换为uint8_t,那么0xFFFFFF01不等于0x01,所以doNothing()函数不再被调用!

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