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

What happens with bitwise shift for all 8 bits

我在 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 个字节),则移到第一个 (lowest/rightmost) 字节之外的位会溢出,并且 "pushed into" 第二个字节。例如:

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 object.

如果将 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