按位移位运算符。已签名和未签名
我正在使用互联网上的补习班笔记练习SCJP考试。
根据我的笔记,操作员应该是右轮班的签名,签名位是从左侧引入的。而左移位操作员应该保留符号位。>>
<<
但是,通过游戏,我能够与操作员一起移动标志(例如 计算结果为 ,而我永远无法与操作员一起移动符号。<<
Integer.MAX_VALUE << 1
-2
>>
我一定是误解了什么,但那又如何呢?
我正在使用互联网上的补习班笔记练习SCJP考试。
根据我的笔记,操作员应该是右轮班的签名,签名位是从左侧引入的。而左移位操作员应该保留符号位。>>
<<
但是,通过游戏,我能够与操作员一起移动标志(例如 计算结果为 ,而我永远无法与操作员一起移动符号。<<
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上进行左移;它不会保持积极的态度。他们懒得尝试进行“有符号”左移的原因是,如果数字从正向负(或反之亦然)移动,那么您无论如何都超出了变量类型的界限。