C语言 按位取反后右移的意外结果



我希望下面的代码会输出10,因为(~port)等于10100101因此,当我们将其右移4时,我们会得到00001010这是10 。但是输出是250!为什么?

int main()
{
    uint8_t port = 0x5a;
    uint8_t result_8 =  (~port) >> 4;
    //result_8 = result_8 >> 4;
    printf("%i", result_8);
    return 0;
}

C 在对uint8_t进行操作之前将提升为int。所以:

  1. port提升为有符号整数0x0000005a
  2. ~颠倒它给0xffffffa5.
  3. 算术移位返回0xfffffffa .
  4. 它被截断回一个uint8_t0xfa == 250

要解决此问题,请截断临时结果:

uint8_t result_8 = (uint8_t)(~port) >> 4;

遮盖它:

uint8_t result_8 = (~port & 0xff) >> 4;

或异或它(谢谢@Nayuki!

uint8_t result_8 = (port ^ 0xff) >> 4;

最新更新