我在研究时发现 Java 和 Perl 在按位移动 -1 时存在差异,我不明白其中的原因。
我认为整数以二进制补码存储,所以如果有32位,-1 就是11...11(重复32次)。 预期-1 >> 1应该等于$2^31 - 1$ = 011...11 = 2147483647。 预期-1 << 1应该等于11...110 = -2。
这些不同行为的原因在哪里,不同语言中的这些标准在哪里说明?
以下是 Perl 和 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");
2147483647
4294967294
在Java中:
public class Tempy {
public static void main(String[] args){
System.out.println( -1 >> 1);
System.out.println( -1 << 1);
}
}
-1
-2
use integer
强制Perl使用有符号的值。 - Powerlordperl -V:ivsize
。 - ikegami