[英]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.