int x = -2139062144; //In binary: 10000000100000001000000010000000
int k = x << 1;
k
是16843008
(二进制文件:1000000010000000100000000
),我不明白为什么?
10000000100000001000000010000000
如何仅通过一个左移位变为1000000010000000100000000
?
我希望它是:10000001000000010000000100000000
保存符号,因为右移位符号是守恒的。
答案 0 :(得分:10)
很简单。
您的Throwable
最多只能携带32位。好吧,一直都是32位。
在
int
最重要的前导位是1.
由于左移,你认为这个注定的位会发生什么?
它已经消失了。它不复存在。它加入了合唱团隐形。这是一个前位。
当然,在最不重要的位置有一个刚出生的0位。所以你最终得到了
10000000100000001000000010000000
结果,或者:
00000001000000010000000100000000
答案 1 :(得分:7)
负值的左移具有未定义的行为。任何事情都可能发生,包括你所看到的。
http://en.cppreference.com/w/cpp/language/operator_arithmetic#Bitwise_shift_operators