按位移位运算符。 签名和未签名

我正在使用互联网上的补习说进行SCJP考试。

根据我的说明, >>操作符应该是右移的符号,符号位从左边开始。 而左移位运算符<<应该保留符号位。

但是,我可以使用<<运算符来移动符号(fe Integer.MAX_VALUE << 1计算结果为-2 ,而我永远无法使用>>运算符移动符号。

我必须在这里误解一些东西,但是什么?

“>>”已签名,因为它保留了标志。 它使用数字的二进制表示中最左边的数字作为填充符。 例如:

  | this value is used as a filler 11011011 >> 11101101 01010010 >> 00101001 

“>>>”是此运算符的无符号版本。 它总是使用零作为填充物:

  11011011 >>> 01101101 01010010 >>> 00101001 

在二进制表示中,最左边的数字确定数字的符号。 所以,如果它是’1’那么我们有负值,如果它是’0′ – 那么我们的数字是正数。 这就是为什么使用最左边的数字作为填充物可以使符号保持永久性。

这种转变背后的想法是它们可以作为乘法并除以2的幂(<< 1相当于* = 2,>> 2相当于/ = 4),这就是转换的签名版本存在的原因。 尽管如此,无符号换档并不能保留负面影响。 正如你的建议,<<运算符实际上并没有保留符号; 它恰好发生在你的例子中。 尝试在2,147,483,647左转; 它不会保持积极的态度。 他们不打算尝试进行“签名”左移是因为,如果数字从正变为负(或反之),那么你无论如何都超出了变量类型的界限。