将uint8_t与数字进行比较

Comparing uint8_t with a number

本文关键字:比较 数字 uint8      更新时间:2023-10-16

也许我理解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();
}

什么都不做仍然没有被叫,但现在我不明白它的原因!我已经明确地将数字转换为uint8!

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

现在终于叫什么都不做了,但又是为什么?两个 uint8 的减法如何返回一个 int?

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

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

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

好吧,

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

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

在情况 2 中,如果您将 1 键入到 uint8_t,则0xFFFFFF01不等于0x01因此不再调用 doNothing() 函数!

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