Java/Perl中的位差异

3
我在研究时发现 Java 和 Perl 在按位移动 -1 时存在差异,我不明白其中的原因。
我认为整数以二进制补码存储,所以如果有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");

2147483647

4294967294

在Java中:

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

-1

-2

1个回答

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。如果不想进行符号扩展,则必须使用逻辑版本的>>>


2
根据 perlop 的说明,你可以使用 use integer 强制Perl使用有符号的值。 - Powerlord
有符号整数-1在Perl的编译版本中如果被视为无符号整数时,它是2^32 -1或2^64 -1。具体而言,这取决于您使用的 perl -V:ivsize - ikegami

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接