按位求反后出现右移的意外结果

时间:2019-04-15 00:46:24

标签: c bit-manipulation

我希望下面的代码将输出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;
}

1 个答案:

答案 0 :(得分:28)

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

  1. port被提升为有符号整数0x0000005a
  2. ~将其取反,得到0xffffffa5
  3. 算术移位返回0xfffffffa
  4. 它被截断成uint8_t,得到0xfa == 250

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

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

屏蔽它:

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

或对其进行xor(感谢@Nayuki!):

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