我有一个大的十六进制数 - $num = 0x80000000
,作为一个字符串。
我想增加它,但由于整数溢出(结果为负),执行hex($num)
不起作用。使用bigint
也不是一个选项,因为bigint仅在perl 5.10及更高版本中实现,我有5.8。我怎么能用这个字符串?
答案 0 :(得分:5)
不要将文字表示与数字与实际值混淆。当你完成任务时,无论你如何表达它,Perl最终都会存储一个数字而不再关心原始表示。使用正常的数字操作。当您想再次查看它时,您可以选择您喜欢的任何表示形式:
$num = 0x8000000;
$num++;
printf "%0x" $num;
如果您将数字表示形式化为字符串,则只需要hex()
,就像从命令行参数中获取一样。您只需要hex
将字符串转换为数字。在那之后,它是一样的。
$num = hex( '8000000' ); # or hex( '0x8000000' )
# $num = hex( $ARGV[0] );
$num++;
printf "%0x" $num;
对于问题的其他部分,bignum
在Perl v5.8上运行正常:
$ perl5.8.9 -le 'my $i = 0xFFFFFFFF_FFFFFFFF; $i++; print $i'
1.84467440737096e+19
$ perl5.8.9 -Mbignum -le 'my $i = 0xFFFFFFFF_FFFFFFFF; $i++; print $i'
18446744073709551616
答案 1 :(得分:0)
通过Perlbrew使用Perl 5.8.9我没有遇到任何问题:
#! /usr/bin/env perl
use strict;
use warnings;
my $num = 0x80000000;
print "$num\n"; # No quotes make this a number and not a string
这会打印出2147483648
,这是0x8000000
的十进制值。
你在哪个平台上?
您可能要做的是在 hex 中打印出这个十六进制数而不是十进制数。您仍然可以使用++
递增它,但要以十六进制打印出来,您需要printf:
#! /usr/bin/env perl
#
use strict;
use warnings;
use Data::Dumper;
my $num = 0x80000000;
for my $loop (0..100) {
$num++;
printf "%-20x\n", $num;
}
打印出来:
80000001
80000002
80000003
80000004
80000005
80000006
80000007
80000008
80000009
8000000a
...
如果确实0x80000000
是一个字符串,使用Perl 5.8.9在我的系统上使用hex将它转换为数字没有问题。
#! /usr/bin/env perl
use strict;
use warnings;
my $num = "0x80000000"; # This is a string
$num = hex $num; # Now it's a number
print "$num\n"; # Prints 2147483648 because `$num` is numeric
正如我所说。这是Perl 5.8.9(在Perlbrew上我得不到5.8.8),这是在Mac上。也许你的平台有点不同。它是具有32位版本的SunOS或Solaris的旧Solaris系统吗?
我已经检查了5.8.8文档,并注意到标准发行版内置了Bigint support。它也附带模块Math::Bigint。
您确定没有Bigint支持吗?