我希望下面的代码将输出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。所以:

  • port提升为有符号整数0x0000005a
  • ~将其反转为0xffffffa5
  • 算术移位返回0xfffffffa
  • 它被截断为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;
    

    关于c - 按位求反后出现右移的意外结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55681351/

    10-15 06:12