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

2022-09-02 00:23:28

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

根据我的笔记,操作员应该是右轮班的签名,签名位是从左侧引入的。而左移位操作员应该保留符号位。>><<

但是,通过游戏,我能够与操作员一起移动标志(例如 计算结果为 ,而我永远无法与操作员一起移动符号。<<Integer.MAX_VALUE << 1-2>>

我一定是误解了什么,但那又如何呢?


答案 1

“>>”是有符号的,因为它保留了这个符号。它使用数字的二进制表示形式中最左边的数字作为填充符。例如:

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

    01010010
 >> 00101001 

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

    11011011 
>>> 01101101  

    01010010
>>> 00101001

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


答案 2

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


推荐