Сравнение uint8_t с номером
Возможно, я не понимаю С++ правильно или это ошибка компилятора?
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?
Компилятор - это uVision ARMCC для ARM Cortex M3.
Ответы
Ответ 1
В a - b
перед вычитанием операнды продвигаются до int
, поэтому результат равен -255, а не 1.
Вот почему и первый, и второй примеры терпят неудачу; это не имеет никакого отношения к другому операнду ==
. Третий конвертирует -255 обратно в uint8_t
, сокращая его по модулю 256, поэтому результат равен 1, как ожидалось.
Ответ 2
Ну, я не самый лучший, когда дело доходит до математики или гексагона, но кажется, что a = 0
и b = 255
, поэтому он равен -255 не 1.
Ответ 3
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, поэтому вызывается noNothing.