在此示例中,我不了解移位的行为

时间:2018-11-21 09:10:40

标签: c bit bit-shift

我知道移位意味着分别向左或向右移动每个位,但是当我尝试将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位。

2 个答案:

答案 0 :(得分:3)

aint,其长度通常为32位。

0x300的值为int

即使您为uint8_t使用a,也需要将结果转换回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将提升为int,并显示0x300

答案 1 :(得分:0)

0x30为十六进制,0000000000110000为二进制。如果您移位4位,则会得到结果0x3000000001100000000

要回复您的编辑,unsigned int不需要1 byte。它占用的字节数与int相同。在您的情况下,可能是4个字节或32位。

之所以用2或3个hex数字来显示数字,是因为未打印开头的0-s。但实际上是0030(hex)

无论如何,您可以使用sizeof检查尺寸。

编辑:如果要占用1个字节,请参见瑞诗凯诗(Rishikesh)答案。