如果我有
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';
答案 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
时会显示正确的值。