忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT HPC论坛 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
123下一页
最近访问板块 发新帖
查看: 12281 | 回复: 29

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

论坛徽章:
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
发表于 2006-12-20 18:23 |显示全部楼层
CPU有状态寄存器的嘛!
加法的话通常可以符号位做xor,乘法不太好估计~

论坛徽章:
0
发表于 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
发表于 2006-12-20 18:35 |显示全部楼层
有空多看点书吧。

论坛徽章:
0
发表于 2006-12-20 18:40 |显示全部楼层
有空就看书岂不是没空啦?现在便是空。空即是色……

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10卯兔
日期:2014-08-22 13:39:09双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17子鼠
日期:2014-07-24 15:38:07
发表于 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
发表于 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
发表于 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
发表于 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
发表于 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号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP