我正在使用网络上的临时笔记来准备SCJP考试。
根据我的笔记,>>
运算符应该是有符号右移,符号位从左侧带入。而左移运算符<<
应该保留符号位。
然而,在尝试中,我能够使用<<
运算符改变符号(例如,Integer.MAX_VALUE << 1
计算结果为-2
),但是我从未能够使用>>
运算符改变符号。
我一定是在哪里误解了,但是在哪里呢?
">>" 是带符号的,因为它保留了符号。它使用一个数字的二进制表示中最左侧的位作为填充位。例如:
| this value is used as a filler
11011011
>> 11101101
01010010
>> 00101001
">>>"是此运算符的无符号版本。它总是使用零作为填充物:
11011011
>>> 01101101
01010010
>>> 00101001
在二进制表示中,最左边的数字决定了数值的符号。如果是'1'则代表负数,如果是'0'则代表正数。因此,使用最左边的数字作为填充位可以保持数值的符号不变。1
或者 0
的时候移入了相反的值,结果的符号会改变。 - Stephen C
-2 << 31
给你什么结果。 - Stephen C