Java/Perl 的按位差异
Bitwise differences in Java/Perl
当我对 -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
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。如果您不想签署扩展,则必须使用逻辑版本 >>>
.
当我对 -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
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。如果您不想签署扩展,则必须使用逻辑版本 >>>
.