代码之家  ›  专栏  ›  技术社区  ›  Kolibrie

Java/Perl中的位差异

  •  3
  • Kolibrie  · 技术社区  · 11 年前

    当我位移到-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");
    

    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 回复  |  直到 11 年前
        1
  •  10
  •   Sinan Ünür    11 年前

    Perl的位移位天生是无符号的,因此-1被视为2^32-1,并自动填充0 so -1 >> 1 为2^31-1,并且 -1 << 1 是2^32-2。

    [编辑]谢谢@Powerlord使用 integer 将强制perl使用带符号的值。

    Java的位移位符号扩展(如果使用 >> )所以 -1<&书信电报;1. 仍为-1且 -1>>1. 是-2。如果不想签署扩展,则必须使用逻辑版本 >>> .