所有 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
我在 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