Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 按位求反后右移的意外结果_C_Bit Manipulation - Fatal编程技术网

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

C 按位求反后右移的意外结果,c,bit-manipulation,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; } 在对其执

我希望下面的代码将输出
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\u t
升级为
int
。因此:

  • 端口
    升级为有符号整数
    0x0000005a
  • ~
    将其反转为
    0xffffffa5
  • 算术移位返回
    0xfffffffa
  • 它被截断回一个
    uint8\u t
    giving
    0xfa==250
  • 要解决此问题,请截断临时结果:

    uint8_t result_8 = (uint8_t)(~port) >> 4;
    
    掩盖它:

    uint8_t result_8 = (~port & 0xff) >> 4;
    
    或者xor(谢谢@Nayuki!):


    你说得对,但我认为C不仅提升了
    uint8\t
    ,而且提升了
    unsigned char
    ,因为我也用
    unsigned char
    测试了它,得到了相同的结果!我说的对吗?
    uint8\u t
    很可能是系统上的
    无符号字符的同义词。升级规则适用于小于
    int
    的所有整数类型。或者仅显式翻转低位8位:
    result=(端口^0xFF)>>4 C++也这么做吗?看见
    
    uint8_t result_8 = (port ^ 0xff) >> 4;