免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3730 | 回复: 9
打印 上一主题 下一主题

Perl做加法运算时如何进行非饱和运算? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-13 16:34 |只看该作者 |倒序浏览
做如下加法运算时,如果结果产生溢出,Perl会默认对结果做饱和运算
my $a = 0xffff4430;
my $b = 0xfffff42c;
my $c = $a + $b; // Perl默认做饱和运算结果为$c=0xffffffff, 非饱和运算时$c=0xFFFF385C

请问在Perl中怎么做非饱和运算的加法? 既0xffff4430 +  0xfffff42c = 0xFFFF385C;

论坛徽章:
0
2 [报告]
发表于 2007-12-13 18:13 |只看该作者
顶一下

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2007-12-13 18:17 |只看该作者
不知道啥叫饱和非饱和

论坛徽章:
0
4 [报告]
发表于 2007-12-13 18:47 |只看该作者
饱和加法在运算结果溢出的时候会自动将结果设置为取值范围的最大值,如0xffff4430 +  0xfffff42c,结果产生了溢出,所以最后结果为0xffffffff, 非饱和运算则不考虑结果的溢出,所以 0xffff4430 +  0xfffff42c = 0xFFFF385C。
在C++或者其他语言中加法通常都是非饱和的,既不考虑结果的溢出情况,但是Perl似乎默认是做的饱和运算,如果产生溢出就自动将结果设置为最大值了。
初学Perl,在做一个校验码的计算,对一个缓冲区的数据进行累加计算校验和,但是由于Perl的加法中为饱和运算,最后得到的结果总是为0xffffffff。不知道有没有什么办法做非饱和运算的加法计算?

论坛徽章:
0
5 [报告]
发表于 2007-12-13 19:52 |只看该作者
  1. $ perl -e '              
  2. my $a=0xffff4430;
  3. my $b=0xfffff42c;
  4. my $c=$a+$b;
  5. printf "%x",$c;'
  6. 1ffff385c
复制代码

Bash 下面运行的结果...

论坛徽章:
0
6 [报告]
发表于 2007-12-13 21:23 |只看该作者
原帖由 __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

论坛徽章:
0
7 [报告]
发表于 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 ;


运行上面代码看看.

论坛徽章:
0
8 [报告]
发表于 2007-12-13 22:12 |只看该作者
原帖由 __lxmxn__ 于 2007-12-13 19:52 发表
$ perl -e '              
my $a=0xffff4430;
my $b=0xfffff42c;
my $c=$a+$b;
printf "%x",$c;'
1ffff385c

Bash 下面运行的结果...


你的是64位机子.

论坛徽章:
0
9 [报告]
发表于 2007-12-13 22:44 |只看该作者
和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)

论坛徽章:
0
10 [报告]
发表于 2007-12-13 22:58 |只看该作者
原帖由 老手 于 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 ;就行了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP