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

时间:2015-09-07 13:29:02

标签: perl hex printf

我发现了一些奇怪的东西。 不同版本的perl的不同行为。

代码是:

$x = -806;
$x = sprintf "0x%x" , $x;
print "$x";

在5.6.1我得到: 0xfffffcda

在5.14我得到: 0xfffffffffffffcda

我怎样才能在5.14中获得32位?

谢谢!

2 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:2)

上述答案的一些补充:

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

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