Java移位运算符

siv*_*636 5 java bit-shift bitwise-operators

考虑以下 Java 代码:

byte a = -64; 
System.out.println(a << 1);
Run Code Online (Sandbox Code Playgroud)

这段代码的输出是 -128

我尝试如下找出为什么这是输出:

64 = 0 1000000(MSB 是符号位)

-64= 1 1000000(陶氏补码格式)

移位后的预期输出:1 0000000(这等于0,因为MSB只是一个符号位)

请任何人解释我缺少什么。

shi*_*t66 1

在移位运算符中,符号位被忽略。所以 1 1000000 << 1 是 10000000,也就是 -128。有什么问题吗?
我们的机器使用二进制补码来表示数字(有符号和无符号)。对于表示负数机器否定它是正数并加 1。
-128 是 !10000000 + 1 = 01111111 + 1 = 10000000
编辑:
我错了,只有右移运算符忽略了符号位。10100000 << 1 == 01000000
对于无符号右移,有一个运算符 >>> 也可以移动符号位。
11000000>>1 == 10100000 和 11000000>>>1 == 01100000

  • 如果忽略符号位,结果如何是有符号(负)数?! (3认同)