免费注册 查看新帖 |

Chinaunix

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

再来个问题,如何检测整数溢出 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-12-20 17:49 |只看该作者 |倒序浏览
两个整数x和y,进行加或乘操作,如何检测结果是否溢出?
如果是无符号数,姑且就说怎么检测结果超过精度了嘛。(whyglinux 你看,害我打了这么多字!

为了方便,把数据类型限制成int或unsigned int。也为了好看,不要写成宏,写成函数,原型如下:
int is_over_flow(val x, val y);
val是int或unsigned int。

溢出返回1, 未溢出返回0.

大家各抒己见哈,对其他人的程序有问题希望从程序上指出来:em11:
呵呵,这对在校的朋友很有帮助哦,面试官经常问点这种问题。

论坛徽章:
0
2 [报告]
发表于 2006-12-20 18:23 |只看该作者
CPU有状态寄存器的嘛!
加法的话通常可以符号位做xor,乘法不太好估计~

论坛徽章:
0
3 [报告]
发表于 2006-12-20 18:27 |只看该作者
原帖由 delimy 于 2006-12-20 18:23 发表
CPU有状态寄存器的嘛!
加法的话通常可以符号位做xor,乘法不太好估计~


如果我没记错的话,无符号数超出精度溢出位不会置位。
不过这个问题希望大家不要用内嵌汇编,因为那和平台相关了。用c!!!

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
4 [报告]
发表于 2006-12-20 18:35 |只看该作者
有空多看点书吧。

论坛徽章:
0
5 [报告]
发表于 2006-12-20 18:40 |只看该作者
有空就看书岂不是没空啦?现在便是空。空即是色……

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
6 [报告]
发表于 2006-12-20 19:29 |只看该作者
不怕丢人,先来一个。

无符号数好说(未测试)
return (unsigned int)(x+y)<x;

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
7 [报告]
发表于 2006-12-20 20:52 |只看该作者
首先,不同的CPU设置的不同
有些东西这个CPU会设置,另外一个CPU不设置。
再者,至少X86,无符号数超出会设置
原帖由 zx_wing 于 2006-12-20 18:27 发表


如果我没记错的话,无符号数超出精度溢出位不会置位。
不过这个问题希望大家不要用内嵌汇编,因为那和平台相关了。用c!!!

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
8 [报告]
发表于 2006-12-20 21:01 |只看该作者
判断两unsigned int相加溢出C码:
if(x+y<x)
...
判断两int相加溢出C码:
z=x+y;
if(x<0 && y<0 && z>0|| x>0 && y>0 && z<0)

论坛徽章:
0
9 [报告]
发表于 2006-12-20 21:27 |只看该作者
对于两整数相加,可以看寄存器
对于两整数相乘,比较麻烦,一种方法是比较绝对值,但不能检测出所有溢出,我觉得可行的方法是看被成熟在不溢出时能乘的最大数和乘数比较

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
10 [报告]
发表于 2006-12-20 21:54 |只看该作者
乘法溢出也可看寄存器。
只要CPU支持。
如果真的要用C:
unsigned int i,j;
unsigned int overflow;
...
if(i == 0) {
     overflow = 0;
} else {
     overflow =  ((unsigned)(-1)/i) < j;
}

[ 本帖最后由 cjaizss 于 2006-12-20 21:56 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP