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 进行修改)。
我发现了一些奇怪的东西。 不同版本的 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 进行修改)。