也许我不正确理解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。
答案 0 :(得分:11)
在a - b
中,操作数在减法之前被提升为int
,因此结果是-255,而不是1.
这就是为什么第一个和第二个例子都失败了;它与==
的其他操作数无关。第三个将-255转换回uint8_t
,将其模数减少为256,因此结果为1,如预期的那样。
答案 1 :(得分:1)
当涉及到数学和十六进制时,我不是最好的,但似乎a = 0
和b = 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。