我是java的初学者...我已经尝试了很多但是找不到以下行的方式
System.out.println(-1>>> 1);
给出2147483647?
任何人都可以帮助我吗?
答案 0 :(得分:3)
这是因为-1
的{{3}}是11111111111111111111111111111111
。当你在它上面执行无符号右移位操作(>>>
)时,它会将所有位移动到参数(在这种情况下为1
)并用零填充左边的空白区域你得到01111111111111111111111111111111
这是Integer.MAX_VALUE = 2147483647
的二进制表示(不知道你从哪里获得2147483648)。
答案 1 :(得分:1)
>>>
是按位右移运算符,带有0符号扩展名 - 换句话说,从左边“传入”的所有位都填充为0。
-1由32位表示,均为1.当您将右移1位且带0符号扩展时,最终会得到一个值,其中31个底部位仍为1,但最高位为0(符号位),所以你最终得到Integer.MAX_VALUE
- 这是你的帖子所说的2147483647,而不是2147483648。
或者在JLS术语中,来自section 15.19:
n >>>
s
的值为n
右移s
位位置为零扩展,其中:如果
n
为正数,则结果与n >> s
的结果相同。如果
n
为负数且左侧操作数的类型为int,则结果等于表达式(n >> s) + (2 << ~s)
的结果。如果
n
为负数且左侧操作数的类型为long,则结果等于表达式(n >> s) + (2L << ~s)
的结果。
这个定义最终使用起来有点痛苦 - 使用“0符号扩展右移”解释,IMO更容易。