Java 为什么签名右移会带来1,而不是在最重要的位置保持1?

Java 为什么签名右移会带来1,而不是在最重要的位置保持1?,java,Java,…并带来0 例如: 1111 0110 >> 2 给予 根据一些注释 为什么要引入1?为什么不将最左边的位保持在1,然后输入0呢 向右移动不是有点像除以2吗?如果是这样的话,0不应该被引入吗?它被称为“符号扩展”,它的存在正是为了达到除以2的效果。如果最左边的位变为0,则原来负数的符号将变为正数。如果只保留最左边的一位,并且更多的位变为零,那么结果与除以二无关 如果您希望在左边加上零,则有一个特殊的运算符:> NB Java只有一个无符号整数,它是char。在这种数据类型上,>通过

…并带来0

例如:

1111 0110 >> 2
给予

根据一些注释

为什么要引入1?为什么不将最左边的位保持在1,然后输入0呢

向右移动不是有点像除以2吗?如果是这样的话,0不应该被引入吗?

它被称为“符号扩展”,它的存在正是为了达到除以2的效果。如果最左边的位变为0,则原来负数的符号将变为正数。如果只保留最左边的一位,并且更多的位变为零,那么结果与除以二无关

如果您希望在左边加上零,则有一个特殊的运算符:
>

NB Java只有一个无符号整数,它是
char
。在这种数据类型上,
>
通过在左边预加零来工作。

它被称为“符号扩展”,它的存在正是为了产生除以二的效果。如果最左边的位变为0,则原来负数的符号将变为正数。如果只保留最左边的一位,并且更多的位变为零,那么结果与除以二无关

如果您希望在左边加上零,则有一个特殊的运算符:
>


NB Java只有一个无符号整数,它是
char
。在这种数据类型上,
>
通过在左边预加零来工作。

您希望右移与除以2相同。假设这是一个有符号的8位量,这是
-128

1000 0000
这是
-64

1100 0000

这是你建议的反例。

你希望右移等于除以2。假设这是一个有符号的8位量,这是
-128

1000 0000
这是
-64

1100 0000

这是你建议的一个反例。

查找2的补码。因为有符号右移等于除以2。算出。因为这将使它成为无符号右移,而不是有符号右移。查找2的补码。因为有符号右移等于除以2。算出它。因为这会使它变成一个无符号右移,而不是有符号右移。是的,我现在明白了。是的,我现在明白了。基本上,当MSB变为1时,其他位的含义也会发生变化,就像现在将它们添加到-128一样。因此,在本例中,
-128+64=-64
。基本上,当MSB变为1时,其他位的含义也会发生变化,就像现在将它们添加到-128一样。所以在这个例子中,
-128+64=-64