perl一元〜没有给出预期的结果

时间:2013-10-31 21:41:13

标签: php perl bit unary-operator

我正在尝试将php算法移植到perl但是我对一个我不熟悉的操作符很困难......

所以php代码看起来像这样:

...
$var = '348492634';
print ~$var;
...

结果:-348492635

在perl中执行完全相同的操作:

...
$var = '348492634';
print ~$var;
...

结果:1​​8446744073361058981

我根据cpu的体系结构阅读了很多关于整数大小的内容,但我从未找到过有效的解决方案。也许我只是在perl中使用了错误的函数......

逻辑必须得到与php脚本相同的结果。

提前致谢

3 个答案:

答案 0 :(得分:2)

似乎在您的设置中,PHP整数是32位签名而perl整数是64位无符号。

这可能会在给定系统上执行您所需的操作,但如果您在另一个perl安装中使用它,则无法保证其工作原理。

$var = '348492634'; #hex!
print ~($var - 2**32) - 2**32;

答案 1 :(得分:1)

以下内容适用于$var='348492634'(您声称拥有)和$var=348492634(您确实拥有):

unpack('l', ~pack('l', $var))

答案 2 :(得分:0)

快速而肮脏的转换是:

print -($var+1);    # like ~$var in PHP

如果你的perl使用的是64位整数,那么$var=-18446744073709551616只会失败 (0x8000000000000000),这是一个你不会在32位PHP中使用的值。