当我向位移-1时,我正在乱搞并注意到Java和Perl之间我不理解的差异。
我认为整数存储在二进制补码二进制中,所以如果有32位,则-1为11 ... 11(32次)。
我希望 -1>> 1 给$ 2 ^ 31 - 1 $ = 011 ... 11 = 2147483647
我希望 -1<< 1 给出= 11 ... 110 = -2。
这些不同行为的原因是什么?这些标准在不同语言中的位置在哪里?
Perl& amp;的代码和打印输出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
答案 0 :(得分: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。如果您不想签名扩展,则必须使用逻辑版本>>>
。