首页 > 解决方案 > 我不明白这个例子中的位移行为

问题描述

我知道移位意味着将每个位分别向左或向右移动,但是当我尝试将 0x30 向左移动 4 个位置时,我得到 0x300 或 00110000000 二进制。(我想要的输出是 0000 0000 )。为什么它会表现这边走?我在 C 中的代码:

int main(void){
 unsigned int a;
 scanf("%x",&a);
 printf("%b",a<<4);
}

输入:30 输出:300 预期输出:0 编辑:如果我为分配的变量使用超过 1 个字节,我希望这个输出,但 unsigned int 正好是 1 个字节,0x300 是 12 位。

标签: cbitbit-shift

解决方案


a是一个int(通常)32位长的。

的值0x300是预期的int

即使您使用uint8_tfora您也需要将结果类型转换回uint8_t以查看预期结果。

int main(void){
  uint8_t a;
  scanf("%hhx",&a);  // you need hhx to read unsigned char (C99 only) 
  printf("%hhx",(uint8_t) (a<<4));
}

供您参考,如果您不进行类型转换,则该值a<<4将被提升int0x300显示


推荐阅读