如何在Perl 5.8中增加十六进制字符串?
我有一个大的十六进制数-如何在Perl 5.8中增加十六进制字符串?,perl,hex,perl5.8,Perl,Hex,Perl5.8,我有一个大的十六进制数-$num=0x8000000,作为一个字符串。 我想增加它,但由于整数溢出(结果为负数),执行hex($num)不起作用。使用bigint也不是一个选项,因为带bigint的十六进制仅在Perl5.10及更高版本中实现,我有5.8。我怎样才能++这个字符串?不要将文字表示法与数字和实际值混淆。在进行赋值时,无论如何表示,Perl最终都会存储一个数字,而不再关心原始表示。对其使用常规数值操作。当您想再次查看它时,可以选择您喜欢的任何表示形式: $num = 0x800000
$num=0x8000000
,作为一个字符串。
我想增加它,但由于整数溢出(结果为负数),执行
hex($num)
不起作用。使用bigint
也不是一个选项,因为带bigint的十六进制仅在Perl5.10及更高版本中实现,我有5.8。我怎样才能++这个字符串?不要将文字表示法与数字和实际值混淆。在进行赋值时,无论如何表示,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
我通过以下途径使用Perl 5.8.9对此没有问题: 这将打印出
2147483648
,它是0x8000000
的十进制值
你在哪个站台
你可能想做的是用十六进制而不是十进制打印出这个十六进制数。您仍然可以使用++
增加它,但要以十六进制打印出来,您需要:
这将打印出:
80000001
80000002
80000003
80000004
80000005
80000006
80000007
80000008
80000009
8000000a
...
如果确实0x8000000
是一个字符串,那么在我的系统上使用Perl 5.8.9将其转换为数字是没有问题的
#! /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
正如我所说。这是Perl5.8.9(我无法在Perlbrew上获得5.8.8),这是在Mac上。也许你的平台有点不同。它是一个带有32位版本的SunOS或Solaris的旧Solaris系统吗
我查看了5.8.8文档,注意到标准发行版确实内置了。它也随模块一起提供
您确定没有Bigint支持吗?
0x8000000
不是字符串,而是数字<代码>“0x8000000”是一个字符串。“0x8000000”
在传递到hex()
时不会溢出。发布一个完整的工作程序,以便我们可以看到您在做什么。这是怎么搞不清楚的?他说他做到了,$num=0x8000000;十六进制($num)
并出现整数溢出错误。该代码不正确,确实会导致该错误。他还陈述了他试图实现的目标。投票重新开放。好的,谢谢。这是一个字符串,我忘记了“”。关于bignum问题-它工作正常,但没有从十六进制字符串转换为bigint的函数hex
。
80000001
80000002
80000003
80000004
80000005
80000006
80000007
80000008
80000009
8000000a
...
#! /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