Perl做加法运算时如何进行非饱和运算?

Perl做加法运算时如何进行非饱和运算?

做如下加法运算时,如果结果产生溢出,Perl会默认对结果做饱和运算
my $a = 0xffff4430;
my $b = 0xfffff42c;
my $c = $a + $b; // Perl默认做饱和运算结果为$c=0xffffffff, 非饱和运算时$c=0xFFFF385C

请问在Perl中怎么做非饱和运算的加法? 既0xffff4430 +  0xfffff42c = 0xFFFF385C;
顶一下
不知道啥叫饱和非饱和
饱和加法在运算结果溢出的时候会自动将结果设置为取值范围的最大值,如0xffff4430 +  0xfffff42c,结果产生了溢出,所以最后结果为0xffffffff, 非饱和运算则不考虑结果的溢出,所以 0xffff4430 +  0xfffff42c = 0xFFFF385C。
在C++或者其他语言中加法通常都是非饱和的,既不考虑结果的溢出情况,但是Perl似乎默认是做的饱和运算,如果产生溢出就自动将结果设置为最大值了。
初学Perl,在做一个校验码的计算,对一个缓冲区的数据进行累加计算校验和,但是由于Perl的加法中为饱和运算,最后得到的结果总是为0xffffffff。不知道有没有什么办法做非饱和运算的加法计算?


[Copy to clipboard] [ - ]
CODE:
$ perl -e '              
my $a=0xffff4430;
my $b=0xfffff42c;
my $c=$a+$b;
printf "%x",$c;'
1ffff385c

Bash 下面运行的结果...


QUOTE:
原帖由 __lxmxn__ 于 2007-12-13 19:52 发表
$ perl -e '              
my $a=0xffff4430;
my $b=0xfffff42c;
my $c=$a+$b;
printf "%x",$c;'
1ffff385c

Bash 下面运行的结果...

你的是什么环境?我在windows/active perl 5.8和RH Linux/Perl 5.8上运行的结果都是ffffffff
#!/usr/bin/perl


use integer ;

my $a = 0xffff4430;
my $b = 0xfffff42c;
my $c = $a + $b;

printf "%x\n",$c ;

no integer ;

$c = $a + $b;

printf "%x\n", $c ;


运行上面代码看看.


QUOTE:
原帖由 __lxmxn__ 于 2007-12-13 19:52 发表
$ perl -e '              
my $a=0xffff4430;
my $b=0xfffff42c;
my $c=$a+$b;
printf "%x",$c;'
1ffff385c

Bash 下面运行的结果...

你的是64位机子.
和32位/64位有关.
试试执行perl -e '$n = 0x100000000'就知道了, 1后面9个0

我遇到的情况是:
(Sun X4100) Linux perl 5.8.4的结果是0x1ffff385c
(Intel PM 1.5G) Windows ActivePerl 5.10结果是0xffffffff


在32位机器上, 你可以这么办,
假设2个加数是$n1和$n2, 若判断之和会溢出, 就输出
printf("%x\n", $n1 - (0xffffffff + 1) + $n2);

至于怎么判断之和是否溢出:
($n1 + $n2) == ($n1 - 1 + $n2)


QUOTE:
原帖由 老手 于 2007-12-13 22:11 发表
#!/usr/bin/perl


use integer ;

my $a = 0xffff4430;
my $b = 0xfffff42c;
my $c = $a + $b;

printf "%x\n",$c ;

no integer ;

$c = $a + $b;

printf "%x\n", $c ;


运行上面代码看看.

非常感谢,用这段代码就OK了! 加上use integer ;就行了。