Perl:将两个数字相加,其中一个大于32位

Perl: Adding two numbers, one of which is more than 32 bits

如果我有

my $hex_str = "fffff00000000";

my $hex_val = hex($hex_str);

my $sum = $hex_val + 5;

$sum 是我所期望的 - 0xfffff00000005

如果我有

my $hex_str = "ffffff00000000";

my $hex_val = hex($hex_str);

my $sum = $hex_val + 5;

Komodo 显示 $sum0xffffff00000008

如果我有

my $hex_str = "fffffff00000000";

my $hex_val = hex($hex_str);

my $sum = $hex_val + 5;

Komodo 显示 $sum0xfffffff00000000

有人可以向我解释为什么在第二种和第三种情况下我会得到意想不到的值吗?

>perl -V:use64bitint
use64bitint='define';

>perl -V:ivsize
ivsize='8';

>perl -V:archname
archname='MSWin32-x64-multi-thread';

您没有显示用于打印 $sum 的代码;这可能是问题所在,但我无法复制它。在任何情况下,如果您启用了警告,对 hex() 的调用将给您一个 Hexadecimal number > 0xffffffff non-portable 警告。

你可以这样做:

use strict;
use warnings;
use Math::BigInt;

my $hex_str = "ffffff00000000";
my $hex_val = Math::BigInt->new("0x$hex_str");
my $sum = $hex_val + 5;
print $sum->as_hex, "\n";

看起来 Komodo(IDE 使用的)或它用来与 perl 交换数据的是使用双精度浮点来存储 64 位值,导致精度损失。

这会导致手表 window 显示 $sum 的错误值,但在 Perl 中使用 printf "%X\n", $sum; 或使用 sprintf "%X", $sum 时显示正确的值来自 Kodomo 手表 window.