如何在Perl 5.8中增加十六进制字符串?

Wea*_*Fox -1 perl hex perl5.8

我有一个大的十六进制数 - $num = 0x80000000作为一个字符串.我想增加它,但hex($num)由于整数溢出(出现负数),做不起作用.using bigint也不是一个选项,因为bigint只在perl 5.10及更高版本中实现,我有5.8.我怎么能用这个字符串?

bri*_*foy 5

不要将文字表示与数字与实际值混淆.当你完成任务时,无论你如何表达它,Perl最终都会存储一个数字而不再关心原始表示.使用正常的数字操作.当您想再次查看它时,您可以选择您喜欢的任何表示形式:

$num = 0x8000000;
$num++;
printf "%0x" $num;
Run Code Online (Sandbox Code Playgroud)

只有hex()在将数字表示作为字符串时才需要,就像从命令行参数中获取一样.您只需hex将字符串转换为数字即可.在那之后,它是一样的.

$num = hex( '8000000' );   # or hex( '0x8000000' )
# $num = hex( $ARGV[0] );
$num++;
printf "%0x" $num;
Run Code Online (Sandbox Code Playgroud)

对于问题的其他部分,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
Run Code Online (Sandbox Code Playgroud)