为什么将a = 1向左移31位然后向右移31位,它变为-1

Sha*_*ian -1 c++ bit-manipulation

特定

int a = 1;(00000000000000000000000000000001),

我做的只是

a=(a<<31)>>31;
Run Code Online (Sandbox Code Playgroud)

我认为a应该仍然1在这个陈述之后(我认为没有改变).但事实证明是-1(11111111111111111111111111111111).谁知道为什么?

Mar*_*k B 5

你缺少的是在C++中,右移>>是实现定义的.它可以是有符号值的逻辑或算术移位.在这种情况下,它1从左侧移动s以保留移位值的符号.通常,您希望避免对签名值进行转换,除非您确切地知道它们是正面的或者转换实现无关紧要.