Perl 带“XOR”的异或运算;使用整数;在Windows和Linux上提供不同的值
为什么我在Windows和Linux上的Perl 带“XOR”的异或运算;使用整数;在Windows和Linux上提供不同的值,perl,32bit-64bit,Perl,32bit 64bit,为什么我在Windows和Linux上的use integerpragma下的XOR表达式0^2506133561会得到不同的结果 窗口: perl -e "use integer; print 0^2506133561" -1788833735 Linux: perl -e 'use integer; print 0^2506133561' 2506133561 无论perl版本如何(32vs64位),输出都应为2506133561 从 最后,使用整数;对按位运算符也有额外的影响。通常,操
use integer
pragma下的XOR表达式0^2506133561
会得到不同的结果
窗口:
perl -e "use integer; print 0^2506133561"
-1788833735
Linux:
perl -e 'use integer; print 0^2506133561'
2506133561
无论perl版本如何(32vs64位),输出都应为2506133561
从
最后,使用整数;对按位运算符也有额外的影响。通常,操作数和结果被视为无符号整数,但使用整数;操作数和结果是有符号的。这意味着,除其他外,~0是-1,-2&-5是-6
如果要强制使用有符号整数,可以执行其他计算
my $n = 0^2506133561;
$n -= 2**32 if $n >>31;
Windows上的Perl解释器很可能使用32位整数,而Linux上使用的是64位整数 要对此进行测试,请运行shell命令:
perl -V:ivsize
在每个系统上。它应该在32位perls上打印ivsize='4'
,在64位perls上打印ivsize='8'
。您还可以使用模块中的$Config{ivsize}
在Perl脚本中获取此信息
要强制位操作的结果即使在64位PERL上也被解释为有符号的32位数字,可以使用:
或者,您可以使用简单的位运算和算术,如mpapec建议的:
$num &= 0xFFFFFFFF;
$num -= 2**32 if $num >= 2**31;
64位windows 7和rhel 6 64位感谢您的回复。。问题是windows中的perl是32位的。非常感谢。问题在于windows中的perl是32位的。
$num = unpack "l", pack "l", $num;
$num &= 0xFFFFFFFF;
$num -= 2**32 if $num >= 2**31;