Java/Perl中的按位差异

Kol*_*rie 3 java binary perl bit-shift bitwise-operators

当我移位-1时,我正在乱搞并注意到Java和Perl之间我不理解的差异.

我认为整数存储在二进制补码二进制中,所以如果有32位,则-1为11 ... 11(32次).
我期望-1 >> 1给$ 2 ^ 31 - 1 $ = 011 ... 11 = 2147483647.
我期望-1 << 1给出= 11 ... 110 = -2.

这些不同行为的原因是什么?这些标准在不同语言中的位置在哪里?

以下是Perl和Java的代码和打印输出:

在Perl中:

print (-1 >> 1, "\n");
print (-1 << 1, "\n");
Run Code Online (Sandbox Code Playgroud)

2147483647

4294967294

在Java中:

public class Tempy {
    public static void main(String[] args){
        System.out.println( -1 >> 1); 
        System.out.println( -1 << 1);
    }
}
Run Code Online (Sandbox Code Playgroud)

-1

-2

twa*_*249 10

Perl的位移本质上是无符号的,因此-1被视为2 ^ 32 -1并且它自动填充0,因此-1 >> 1是2 ^ 31-1并且-1 << 1是2 ^ 32-2.

[编辑]感谢@Powerlord使用integer将强制perl使用签名值.

Java的位移符号扩展(如果使用>>),所以-1 << 1仍为-1,-1 >> 1为-2.如果您不想签署扩展,则必须使用逻辑版本>>>.

  • 根据[perlop](http://perldoc.perl.org/perlop.html),您可以使用整数来强制Perl使用带符号的值. (2认同)