Сравнение uint8_t с числом

Может быть, я неправильно понимаю 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?

Компилятор uVision ARMCC для ARM Cortex M3.

10

Решение

В a - b, операнды повышаются до int до вычитания, поэтому результат равен -255, а не 1.

Вот почему и первый, и второй примеры терпят неудачу; это не имеет ничего общего с другим операндом ==, Третий преобразует -255 обратно в uint8_t, уменьшив его по модулю 256, поэтому результат равен 1, как и ожидалось.

11

Другие решения

ну, я не лучший, когда дело доходит до математики, ни гекса, но кажется, что a = 0 а также b = 255 так что это равно -255, а не 1.

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 не вызывается.

-1
По вопросам рекламы [email protected]