C中的左移位操作

Sop*_*oph 0 c bits

我试图移动值为1111的变量'a'并将其移到左边,这样我就可以得到1110意味着它应该打印数字14.然而,它是打印30.我想是因为它是移位,但它没有最左边的位(11110),但它应该是1110.这是我的代码.谢谢.

int main(int argc, char *argv[]) {
unsigned a;
a=0xF;
a=a<<1; 
printf(": %u\n",a);
Run Code Online (Sandbox Code Playgroud)

Ian*_*and 8

您的a变量被声明为unsigned- 这意味着它是一个unsigned int,通常有32位.所以当你0xF加入它时,它确实包含0x0000000F,或者

00000000000000000000000000001111
Run Code Online (Sandbox Code Playgroud)

在二进制.

当您将该位置向左移动时,它包含

00000000000000000000000000011110
Run Code Online (Sandbox Code Playgroud)

或十进制30.(0x1e十六进制)

如果你想将它限制在4位,你需要AND在每次移位操作后得到0xF的结果,比如

a = a << 1;
a = a & 0xF;
Run Code Online (Sandbox Code Playgroud)

这将导致a仅包含1110(但实际上包含00000000000000000000000000001110)