我知道移位意味着分别向左或向右移动每个位,但是当我尝试将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位。
答案 0 :(得分:3)
a
是int
,其长度通常为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位,则会得到结果0x300
或0000001100000000
。
要回复您的编辑,unsigned int
不需要1 byte
。它占用的字节数与int
相同。在您的情况下,可能是4个字节或32位。
之所以用2或3个hex
数字来显示数字,是因为未打印开头的0-s。但实际上是0030(hex)
。
无论如何,您可以使用sizeof
检查尺寸。
编辑:如果要占用1个字节,请参见瑞诗凯诗(Rishikesh)答案。