我正在使用互联网上的补习说进行SCJP考试。
根据我的说明,>>
运算符应该是右移符号,符号位从左边开始。虽然左移位运算符<<
应该保留符号位。
然后玩,我可以使用<<
运算符(fe Integer.MAX_VALUE << 1
评估为-2
来移动符号,而我永远无法使用>>
移动符号{{1}}运营商。
我一定是在误解某些东西,但是什么?
答案 0 :(得分:43)
“&GT;&gt;” 中签署是因为它保留了标志。它使用数字的二进制表示中最左边的数字作为填充符。例如:
| this value is used as a filler
11011011
>> 11101101
01010010
>> 00101001
“&GT;&GT;&gt;” 中是此运算符的无符号版本。它总是使用零作为填充物:
11011011
>>> 01101101
01010010
>>> 00101001
在二进制表示中,最左边的数字确定数字的符号。所以,如果它是'1'那么我们有负值,如果它是'0' - 那么我们的数字是正数。这就是为什么使用最左边的数字作为填充物可以使符号保持永久性。
答案 1 :(得分:2)
这种转变背后的想法是它们可以作为乘法并除以2的幂(&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; 1等于* = 2,&gt;&gt;&gt; 2等于/ = 4),这就是为什么已签名的转移版本存在。但是,无符号转移不一定能够保留负面因素。 &lt;&lt;&lt;正如你的建议,运营商并没有真正保留标志;它恰好发生在你的例子中。尝试在2,147,483,647左转;它不会保持积极的态度。他们之所以不愿意尝试签署“#39;&#39;左移是因为,如果数字从正变为负(或反之),那么你无论如何都超出了变量类型的范围。