使用“use integer”的XOR操作在Windows和Linux上给出了不同的值

时间:2014-02-12 12:06:04

标签: perl 32bit-64bit

为什么我在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

2 个答案:

答案 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

来自perldoc integer

  

最后,使用整数;对按位运算符也有一个额外的影响。通常,操作数和结果被视为无符号整数,但使用整数;操作数和结果已签名。这意味着,除了其他之外,~0是-1,并且-2& -5是-6。

如果要强制使用有符号整数,可以执行其他计算,

my $n = 0^2506133561;
$n -= 2**32 if $n >>31;