我发现了一些奇怪的东西。 不同版本的Perl的不同行为。Perl 5.6.1与Perl 5.14 - 将十进制转换为十六进制
的代码是:
$x = -806;
$x = sprintf "0x%x" , $x;
print "$x";
在5.6.1,我得到: 0xfffffcda
在5.14获得: 0xfffffffffffffcda
我如何获得32位在5.14,以及?
谢谢!
我发现了一些奇怪的东西。 不同版本的Perl的不同行为。Perl 5.6.1与Perl 5.14 - 将十进制转换为十六进制
的代码是:
$x = -806;
$x = sprintf "0x%x" , $x;
print "$x";
在5.6.1,我得到: 0xfffffcda
在5.14获得: 0xfffffffffffffcda
我如何获得32位在5.14,以及?
谢谢!
负数的事情是他们通过二进制补码来表示。你看到的是字大小的结果。
我不完全确定它为什么会发生变化(除了14年和一般迁移到64位),但要重新编译perl并不容易。我建议这不是一个好主意,因为你真正想要得到的是一个串化。
一种更简单的解决方案将是一个按位与具有适当长度的位掩码:
$x = -806;
$x = sprintf ("0x%x" , $x & 0xffffffff);
print "$x";
简单和天才!谢谢! –
一些除了上面的答案:
数字Perl的产生的数量时,其sprintf
转换为十六进制取决于本机C数据类型Perl的大小在内部用于存储无符号整数值。 Perl的Configure
脚本在设置编译Perl解释器时决定了哪种类型,因此它不是在运行时可以更改的东西。它也可能因操作系统和机器而异,所以如果您在不同的环境中运行脚本,则无法确定将生成多少十六进制数字(强烈赞成Sobrique的建议)。自5.6.1发布以来的14年间,默认本机类型很可能会从32位版本更改为64位版本。
如果您想知道在特定的perl安装中使用哪种类型,perl -MConfig -E 'say $Config{uvtype}'
会告诉您(根据需要修改5.10版之前的版本)。
请注意,它与Perl版本无关。你可以有一个64位版本的Perl 5.6和一个32位版本的5.14。 – ikegami