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

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

 01000101 << 8 

我的答案是100010100000000

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

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

 69 << 8 //note 69 is int 

它实际上是这样应用的

 00000000 00000000 00000000 01000101 << 8 

这样你就得到了结果

 00000000 00000000 01000101 00000000 

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

 unsigned char a = 69 << 8; //resulting in 0 

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

 01000101 00000000 

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

 00000000 

位移操作符作用于整个对象,而不是单个字节。 如果存储对象69的对象宽度大于1字节(例如,int通常为4字节),则移位到第一字节溢出之外的位被“推入”第二字节。 例如:

 00000000 00000000 00000000 01000101 //The number 69, stored in a 32 bit object 00000000 00000000 01010000 00000000 //shifted left by 8 

如果您将数字存储在1字节变量(例如char)中,则结果确实为零。

  01000101 //The number 69, stored in an 8 bit object (01000101) 00000000 //shifted left by 8 ^^^^^^^^ these bits have been shifted outside the size of the variable 

如果将int移动32,则会发生同样的事情。

 00000000 00000000 00000000 01000101 //The number 69, stored in a 32 bit int 00000000 00000000 01010000 00000000 //shifted left by 8 00000000 01010000 00000000 00000000 //shifted left by 16 01010000 00000000 00000000 00000000 //shifted left by 24 00000000 00000000 00000000 00000000 //shifted left by 32, overflow