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 显示 $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';
您没有显示用于打印 $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.
如果我有
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';
您没有显示用于打印 $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.