Сравнение 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();
}
doNothing до сих пор не называется, но теперь я не понимаю причину этого! Я явно привел число к uint8!
if( (uint8_t)(a - b) == 1 )
{
doNothing();
}
Теперь doNothing, наконец, называется, но опять же почему? Как вычитание двух uint8 может вернуть int?
компилятор uVision ARMCC для ARM Cortex M3.
3 ответов
на a - b
операнды преобразуются в int
перед вычитанием, поэтому результат -255, а не 1.
вот почему первый и второй примеры терпят неудачу; это не имеет ничего общего с другим операндом ==
. Третьего преобразует -255 обратно в uint8_t
, уменьшая его по модулю 256, поэтому результат равен 1, как ожидалось.
ну, я не лучший, когда дело доходит до математики или hex, но кажется, что a = 0
и b = 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.