Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Perl 5.8中增加十六进制字符串?_Perl_Hex_Perl5.8 - Fatal编程技术网

如何在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