关于Java的算术右移运算符

书上是这样说的:算数右移运算符用来将一个数据的所有二进制位全部右移若干位。移出的最低位被舍弃,最高位用符号位补入。

可是下面的例子我没看明白:-5右移一位等于-3,而不是-2。请问为什么?

你说的右移应该是整数除法里面提到的吧。
整数除法总是zero-round,即商总是向靠近0的数方向进行舍入。
因为要向0靠近,所以负数在除2的幂之前会先加上一个偏移量2的k次方减1(2k-1,k为右移的位数)以修正
假设8位有符号表示:
则-5的补码为 1111 1011
右移一位: 1111 1101
上面的结果是-3的补码,和实际不符(-5/2 = -2)
加上修正值: 1111 1011 + 2的一次方减1 = 1111 1011 + 1 = 1111 1100
然后再右移一位:1111 1110 <= -2的补码!
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-10-02
计算机是用补码表示的,用八位补码表示-5是11111011,右移一位是11111101,把这个补码写成原码表示就是10000011,显然,这个数是-3.本回答被提问者采纳
第2个回答  2009-10-02
-5:11111111 11111111 11111111 11111011
算术(带符号位)右移:
11111111 11111111 11111111 11111101,即为-3
逻辑(不带符号位)右移
01111111 11111111 11111111 11111101,即为2^31 - 2 = 2147483646

另外,
1.
byte, short, int类型在移位时 全按32位算,long按64位算,
例如:byte a = 1; 则(a >> 1)是一个int 类型,
2.
int a = 1; a >> x 相当于a >> (x % 32),
long b = 1; b >> y 相当于a >> (y % 64),
例如:“a >> 32”结果仍是a,而“a = a >> 31; a = a >> 1”结果为0
3.
byte a = 1; a >>= 1;相当于a = (byte)a >> 1;
相似回答