所有8位的按位移位会发生什么

Tec*_*chJ 4 c bit-shift bitwise-operators

我在c中有一个小查询,我在数字69上01000101使用二进制的按位左移

01000101  << 8 
Run Code Online (Sandbox Code Playgroud)

我得到的回答是 100010100000000

不应该全是8个零,即00000000 我们将所有8位向左移动然后用零填充.

Ian*_*Ian 7

这是因为数字(int)的文字(默认数据类型)在大多数现在的CPU中大于8-bit(通常32-bit),因此当你申请时

69 << 8 //note 69 is int
Run Code Online (Sandbox Code Playgroud)

它实际上是这样应用的

00000000 00000000 00000000 01000101 << 8
Run Code Online (Sandbox Code Playgroud)

这样你就得到了结果

00000000 00000000 01000101 00000000
Run Code Online (Sandbox Code Playgroud)

如果你特别使用,unsigned char那么它就不会发生:

unsigned char a = 69 << 8; //resulting in 0
Run Code Online (Sandbox Code Playgroud)

这是因为虽然69 << 8它本身仍将导致

01000101 00000000
Run Code Online (Sandbox Code Playgroud)

但是上面的值将被转换为8-bit unsigned char,导致:

00000000
Run Code Online (Sandbox Code Playgroud)