爲什麼我在Windows和Linux上的use integer
編譯指示下爲異或表達式0^2506133561
獲得了不同的結果?使用「使用整數」的XOR操作在Windows和Linux上給出了不同的值
的Windows:
perl -e "use integer; print 0^2506133561"
-1788833735
的Linux:
perl -e 'use integer; print 0^2506133561'
2506133561
爲什麼我在Windows和Linux上的use integer
編譯指示下爲異或表達式0^2506133561
獲得了不同的結果?使用「使用整數」的XOR操作在Windows和Linux上給出了不同的值
的Windows:
perl -e "use integer; print 0^2506133561"
-1788833735
的Linux:
perl -e 'use integer; print 0^2506133561'
2506133561
perl -e "use bigint; print 0^2506133561;"
輸出應爲2506133561
不管Perl版本(32vs64位)
最後用整數;對位運算符也有額外的影響。通常,操作數和結果被視爲無符號整數,但使用整數;操作數和結果被簽名。這意味着,除了別的以外,〜0是-1,並且-2是-3。
如果要強制符號整數,您可以執行其他計算,
my $n = 0^2506133561;
$n -= 2**32 if $n >>31;
在Windows上你的Perl解釋器很可能使用的是32位整數,當你在Linux上使用一個具有64位整數。
爲了測試這一點,運行的外殼命令:
perl -V:ivsize
每個系統上。它應該在32位perls上打印ivsize='4'
,而在64位perls上打印ivsize='8'
。您還可以使用Config模塊中的$Config{ivsize}
以Perl腳本獲取此信息。
強制位操作的結果被解釋爲一個有符號的32位數字,即使在64位皮爾斯,您可以使用pack
:
$num = unpack "l", pack "l", $num;
或者,你可以使用簡單的位操作和算術如mpapec建議:
$num &= 0xFFFFFFFF;
$num -= 2**32 if $num >= 2**31;
感謝您的回覆.. 問題是與Windows中的32位perl。 – Saravanan
64 vs 32bit perl? –
64位Windows 7和rhel 6 64位 – Saravanan