繁体   English   中英

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

[英]Bitwise shift operators. Signed and unsigned

我正在使用互联网上的补习说进行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左转; 它不会保持积极的态度。 他们不打算尝试进行“签名”左移是因为,如果数字从正变为负(或反之),那么你无论如何都超出了变量类型的界限。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM