Perl 5.6.1 vs. Perl 5.14 - 将dec转换为hex

AJ *_*tes 1 perl printf hex

我发现了一些奇怪的事 不同版本的perl的不同行为.

代码是:

$x = -806;
$x = sprintf "0x%x" , $x;
print "$x";
Run Code Online (Sandbox Code Playgroud)

在5.6.1中,我得到:0xfffffcda

在5.14我得到:0xfffffffffffffcda

我如何在5.14中获得32位?

谢谢!

Sob*_*que 5

带负数的东西是它们通过2s补码二进制表示.您所看到的是字大小的结果.

我不完全确定它为什么会发生变化(除了14年以及一般移动到64位),但如果不重新编译perl就不容易修复.我建议这不是一个好主意,因为你真正想要得到的是字符串化.

一个更简单的解决方案是使用适当长度的位掩码进行按位AND:

$x = -806;
$x = sprintf ("0x%x" , $x & 0xffffffff);
print "$x";
Run Code Online (Sandbox Code Playgroud)