21

我正在使用互联网上的补习笔记练习 SCJP 考试。

根据我的笔记,>>操作符应该是右移符号,符号位是从左边引入的。而左移运算符<<应该保留符号位。

但是,我可以使用<<运算符移动符号(feInteger.MAX_VALUE << 1评估为-2,而我永远无法使用>>运算符移动符号。

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

4

2 回答 2

51

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

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

    01010010
 >> 00101001 

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

    11011011 
>>> 01101101  

    01010010
>>> 00101001

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

于 2010-02-11T12:38:57.557 回答
3

移位背后的想法是它们可以用作乘以和除以 2 的幂(<< 1 等价于 *= 2,>> 2 等价于 /= 4),这就是有符号版本的移位存在的原因。但是,无符号移位不一定会保留符号。正如您所建议的, << 运算符实际上并没有保留符号;它只是发生在你的例子中。尝试对 2,147,483,647 进行左移;它不会保持积极状态。他们不费心尝试进行“有符号”左移的原因是,如果数字从正数变为负数(反之亦然),那么无论如何您都超出了变量类型的范围。

于 2014-04-28T13:33:55.240 回答