在Java编程语言中,>> 和 >>> 都是右移运算符,但它们有以下区别:
算术右移(Arithmetic Right Shift, >>):
逻辑右移(Logical Right Shift, >>>):
// 以数字2为例来进一步解释 >>(算术右移)和 >>>(逻辑右移)的区别:
int num = 2; // 十进制表示,二进制为:00000010
// 算术右移(对于正数,算术右移与逻辑右移结果相同)
int arithmeticShifted = num >> 1;
// 结果:1,二进制为:00000001
// 逻辑右移
int unsignedShifted = num >>> 1;
// 结果:1,二进制同样为:00000001
// 以数字-2为例来说明 >>(算术右移)和 >>>(逻辑右移)的区别:
int num = -2; // 十进制表示
// 二进制补码形式为:11111111 11111111 11111111 11111110 (32位)
// 算术右移(对于负数,高位补符号位)
int arithmeticShifted = num >> 1;
// 二进制补码形式为:11111111 11111111 11111111 11111111
// 原码:10000000 00000000 00000000 00000001 结果:-1
// 逻辑右移(无论正负,高位都补0)
int unsignedShifted = num >>> 1;
// 二进制补码形式为:01111111 11111111 11111111 11111111
// 原码:01111111 11111111 11111111 11111111 结果:2^32-1=2147483647