>>>和>>运算符之间的区别

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

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

我的理解是否正确?

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

负数表示的方式称为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。

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

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

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