我很惊讶地看到-1除以2使用逐位运算结果-1。
我期望返回0。
就像你把1或-1除以2一样,小数部分被去掉了,我们得到的是零。这可能与二的补码有关,但这只是一种猜测,我并不完全理解。
有人能解释一下吗?
-1 \f25 >> 1= -1
-1 /2=0
public class JavaFiddle
{
public static void main(String[] args)
{
System.out.println(-1 >> 1);
System.out.println(-1 / 2);
}
}发布于 2020-05-07 21:06:24
java中的负数使用一种称为2's complement的符号来表示。如果我们假设有符号整数的大小是8。你可以这样想2的补码。
2 will be 00000010
1 will be 00000001
0 will be 00000000
-1 will be 11111111 (Count in reverse from max)
-2 will be 11111110
-3 will be 11111101(在java中,int的大小实际上是4个字节)
>>这是有符号的右移位运算符。根据documentation,对于正数,它将在最左边的位置填充0,对于负数,它将用1填充相同的位置。
这意味着移动-1的任意次数只给-1。
11111111 >> 1 = 11111111这是因为负数除以2和右移的Non-equivalence of arithmetic right shift and division含义并不是在所有情况下都相等
https://stackoverflow.com/questions/61658253
复制相似问题