5

如果移位的数字是正数 >>> 和 >> 工作相同。

如果移位数为负数 >>> 用 1 填充最高有效位,而 >> 操作移位用 0 填充 MSB。

我的理解正确吗?

如果负数存储时将 MSB 设置为 1 而不是 Java 使用的 2s 补码方式,则运算符的行为将完全不同,对吗?

4

3 回答 3

8

表示负数的方式称为 2 的补码。为了演示这是如何工作的,以 -12 为例。12,在二进制中,是 00001100(假设整数是 8 位,但实际上它们要大得多)。通过简单地反转每一位来取 2 的补码,你得到 11110011。然后,简单地加 1 得到 11110100。注意,如果你再次应用相同的步骤,你会得到正的 12。

无论如何,>>> 都会移到零,所以 12 >>> 1 应该给你 00000110,即 6,而 (-12) >>> 1 应该给你 01111010,即 122。如果你真的尝试这个Java,你会得到一个更大的数字,因为 Java 整数实际上比 8 位大得多。

>> 移动位与最高位相同,因此正数保持正数,负数保持负数。12 >> 1 是 00000110 (仍然是 6)和 (-12) >> 1 将是 11111010 是负 6。

于 2009-12-29T00:53:50.360 回答
2

>>>Java语言规范中运算符的定义

的值n>>>s是 n 右移 s 位位置,零扩展。如果 n 为正,则结果与 的相同n>>s;如果 n 为负数,则如果左侧操作数的类型是 ,则结果等于表达式的结果;(n>>s)+(2<<~s)如果左侧操作数的类型是 ,则结果等于int表达式(n>>s)+(2L<<~s)的结果long

于 2009-12-29T00:48:31.570 回答
1

正好相反,如果 ho 位为 1,则 >>> 用零填充,而 >> 用 1 填充。

于 2009-12-29T00:47:15.273 回答