为什么我在Windows和Linux上0 ^ 2506133561
pragma下的XOR表达式use integer
得到不同的结果?
视窗:
perl -e "use integer; print 0^2506133561"
-1788833735
Linux的:
perl -e 'use integer; print 0^2506133561'
2506133561
答案 0 :(得分:4)
Windows上的Perl解释器很可能使用32位整数,而您在Linux上使用的解释器则使用64位整数。
要测试此操作,请运行shell命令:
perl -V:ivsize
在每个系统上。它应该在32位perls上打印ivsize='4'
,在64位perls上打印ivsize='8'
。您还可以使用Config模块中的$Config{ivsize}
在Perl脚本中获取此信息。
即使在64位perls上强制将位操作的结果解释为带符号的32位数,也可以使用pack
:
$num = unpack "l", pack "l", $num;
或者,您可以使用简单的位操作和算法,如mpapec建议:
$num &= 0xFFFFFFFF;
$num -= 2**32 if $num >= 2**31;
答案 1 :(得分:3)
perl -e "use bigint; print 0^2506133561;"
无论perl版本(32vs64位),输出应为2506133561
最后,使用整数;对按位运算符也有一个额外的影响。通常,操作数和结果被视为无符号整数,但使用整数;操作数和结果已签名。这意味着,除了其他之外,~0是-1,并且-2& -5是-6。
如果要强制使用有符号整数,可以执行其他计算,
my $n = 0^2506133561;
$n -= 2**32 if $n >>31;