2015-09-07 170 views
1

我发现了一些奇怪的东西。 不同版本的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,以及?

谢谢!

+0

请注意,它与Perl版本无关。你可以有一个64位版本的Perl 5.6和一个32位版本的5.14。 – ikegami

回答

5

负数的事情是他们通过二进制补码来表示。你看到的是字大小的结果。

我不完全确定它为什么会发生变化(除了14年和一般迁移到64位),但要重新编译perl并不容易。我建议这不是一个好主意,因为你真正想要得到的是一个串化。

一种更简单的解决方案将是一个按位与具有适当长度的位掩码:

$x = -806; 
$x = sprintf ("0x%x" , $x & 0xffffffff); 
print "$x"; 
+0

简单和天才!谢谢! –

2

一些除了上面的答案:

数字Perl的产生的数量时,其sprintf转换为十六进制取决于本机C数据类型Perl的大小在内部用于存储无符号整数值。 Perl的Configure脚本在设置编译Perl解释器时决定了哪种类型,因此它不是在运行时可以更改的东西。它也可能因操作系统和机器而异,所以如果您在不同的环境中运行脚本,则无法确定将生成多少十六进制数字(强烈赞成Sobrique的建议)。自5.6.1发布以来的14年间,默认本机类型很可能会从32位版本更改为64位版本。

如果您想知道在特定的perl安装中使用哪种类型,perl -MConfig -E 'say $Config{uvtype}'会告诉您(根据需要修改5.10版之前的版本)。

相关问题