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只是一个符号位)
请任何人解释我缺少什么。
在移位运算符中,符号位被忽略。所以 1 1000000 << 1 是 10000000,也就是 -128。有什么问题吗?
我们的机器使用二进制补码来表示数字(有符号和无符号)。对于表示负数机器否定它是正数并加 1。
-128 是 !10000000 + 1 = 01111111 + 1 = 10000000
编辑:
我错了,只有右移运算符忽略了符号位。10100000 << 1 == 01000000
对于无符号右移,有一个运算符 >>> 也可以移动符号位。
11000000>>1 == 10100000 和 11000000>>>1 == 01100000
| 归档时间: |
|
| 查看次数: |
6525 次 |
| 最近记录: |