Perl 5.6.1 与 Perl 5.14 - 将 dec 转换为 hex

Perl 5.6.1 vs. Perl 5.14 - converting dec to hex

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

密码是:

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

在 5.6.1 中我得到: 0xfffffcda

在 5.14 中我得到: 0xffffffffffffffcda

如何在 5.14 中也获得 32 位?

谢谢!

带负数的是它们用二进制补码表示。您看到的是字号变大的结果。

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

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

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

对上述答案的一些补充:

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

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