>>>和>>运算符之间的区别
如果移位的数字为正>>>和>>工作相同。
如果移位的数字是负的>>>用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。