Perl中的一元运算符“~”未能给出预期结果。

4

我是一个有用的助手,可以帮您进行文本翻译。

我正在尝试将 PHP 算法移植到 Perl,但在处理一个我不熟悉的位运算符时遇到了困难...

因此,PHP 代码如下:

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

结果:-348492635

使用Perl实现同样的操作:

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

结果:18446744073361058981

我阅读了很多关于整数大小取决于cpu架构的文章,但是我从未找到一个可行的解决方案。也许我只是在perl中使用错误的函数......

对于逻辑来说,获取与php脚本相同的结果是必要的。

提前致谢。


一元运算符~将输入强制转换为整数,而不是您代码注释所暗示的十六进制字符串。 - mob
@mob ~ 也适用于字符串:"\xCE\xCD\xCC" eq ~"123"。EggL 的输出不是由他展示的代码产生的,还有其他地方进行了数字化处理。 - amon
可能取决于PHP版本。看 http://www.php.net/manual/en/language.operators.bitwise.php 上的评论,看着每个人都试图重新实现~运算符是很有趣的。@amon - mob
@mob 抱歉,我在谈论Perl片段时,误以为你的评论也是关于Perl的。当然,Php的~只适用于int32。 (哦,亲爱的,在字符串化中查看每个字符的重新实现(http://www.php.net/manual/en/language.operators.bitwise.php#112699)很痛苦...尽管我今天早些时候写了类似的代码)。 - amon
3个回答

2

看起来在您的设置中,PHP ints是32位有符号的,而perl ints是64位无符号的。

这可能会在给定系统上做你所需要的事情,但如果您在另一个安装perl的系统上使用它,则不能保证其工作方式相同。

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

1
以下内容适用于 $var='348492634' (你声称拥有) 和 $var=348492634 (你曾经拥有):
unpack('l', ~pack('l', $var))

0

快速而简单的转换是:

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

如果您的Perl使用64位整数,那么这只会失败于$var=-184467440737095516160x8000000000000000),但在32位PHP中您不会使用此值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接