比特转移混乱

rim*_*ire 2 c bit

为什么0x56 << 2不等于0x58

0x560 1 0 1 0 1 1 0 如此移2位,我们得到的左

         0 1 0 1 1 0 0 0
Run Code Online (Sandbox Code Playgroud)

010110000x58.但它不是正确的答案0x158.所以我在这里缺少什么?

即使我这样做:

int main(){
    unsigned char a;
    a=0x56;
    printf("%x",a<<2);  // I am expecting the output to be 58 here.
} 
Run Code Online (Sandbox Code Playgroud)

为什么打印158. 为什么不考虑只有8位?

Aja*_*iya 8

比特移位运算符<<,并>>仅在整数的工作.因此,当您在此处使用它时,它们首先被提升为int(大于1个字节),然后完成转换.您可以看到标准中提到的是6.5.7p3

对每个操作数执行整数提升.结果的类型是提升的左操作数的类型.

printf(with %x和format specifier)也期望参数是类型的unsigned int.因此,没有降级执行,你得到0x158.

如果您希望结果只有一个字节,则应将结果转换回unsigned char-

printf("%x", (unsigned char)(a << 2));
Run Code Online (Sandbox Code Playgroud)

或者你可以声明另一个变量b并打印出来 -

unsigned char b;   
b = a << 2;
printf("%x", b);
Run Code Online (Sandbox Code Playgroud)

你可以在这里看到演示.

  • `(a << 2)&0xFF`也是一种享受. (2认同)