C повышает uint8_t
до int
перед выполнением операций с ним. Итак:
port
повышается до целого числа со знаком 0x0000005a
.
~
инвертирует, давая 0xffffffa5
.
- Арифметический сдвиг возвращает
0xfffffffa
.
- Он усекается обратно в
uint8_t
, давая 0xfa == 250
.
Чтобы это исправить, либо обрежьте временный результат:
uint8_t result_8 = (uint8_t)(~port) >> 4;
замаскируйте его:
uint8_t result_8 = (~port & 0xff) >> 4;
или еще раз (спасибо @Nayuki!):
uint8_t result_8 = (port ^ 0xff) >> 4;