Perl:添加两个数字,其中一个超过32位

时间:2016-11-08 01:58:35

标签: perl komodo

如果我有

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将$sum显示为0xffffff00000008

如果我有

my $hex_str = "fffffff00000000";

my $hex_val = hex($hex_str);

my $sum = $hex_val + 5;

Komodo将$sum显示为0xfffffff00000000

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

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

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

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

2 个答案:

答案 0 :(得分:2)

您不会显示用于打印$ 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";

答案 1 :(得分:2)

似乎Komodo(使用的IDE)或用于与perl交换数据的内容使用双精度浮点来存储64位值,从而导致精度损失。

这会导致监视窗口显示$sum的错误值,但在Perl中使用printf "%X\n", $sum;或从Kodomo监视窗口使用sprintf "%X", $sum时会显示正确的值。