【发布时间】:2019-05-08 17:30:38
【问题描述】:
为什么无符号右移(逻辑右移)和有符号右移(算术右移)对负数产生相同的结果?
Log.v("-59 >>> 5 expected 6, actual", String.valueOf((byte)(-59 >>> 5)));
Log.v("11000101 >>> 5 expected 00000110, actual",Integer.toBinaryString( -59 >>> 5));
Log.v("11000101 >> 5 expected 00000110, actual",Integer.toBinaryString( -59 >> 5));
Android Studio Logcat 输出
-59 >>> 5 expected 6, actual: -2
11000101 >>> 5 expected 00000110, actual: 111111111111111111111111110
11000101 >> 5 expected 00000110, actual: 11111111111111111111111111111110
【问题讨论】:
-
"这是一个 java VM 错误" 这不应该是你的第一个假设。请解释你为什么期望你所期望的。
-
"为什么和有符号右移一样?"它不是。
111111111111111111111111110 != 11111111111111111111111111111110(计算前导 1)。 -
而 int 是 32 位的,而不是您认为的 8 位...
-
-59 的二进制表示为 11000101,当它在逻辑上向右移动时,结果应该是 00000110,即十进制 6。但是当我使用 >>> 运算符时,我得到 -2 相当于 11111110 .这表明已完成有符号右移,而不是逻辑移位。
标签: java