"整数相加溢出"引出的思考
来源:互联网 发布:精子优化处理检查 必要 编辑:程序博客网 时间:2024/06/03 16:08
前段时间在修复某系统的bug时, 发现一位同事在代码中加入了类似如下的语句:
int a = 0;int b = 0;/*some codes*/if ( a + b <= 0) { /*some codes: invalid a or b*/}
同事解释说: 用来判断溢出. 听了解释后, 我点头称是, 觉得这是个好招.
刚才, 在看"C Traps and Pitfalls"一书中的"3.6 Integer Overflow"一节时, 顿感羞愧. 在几十年前就已经有很好的解决方案了, 如下:
有符号整数相加溢出的结果是未定义的. 例如有的系统中, 加法操作有权利设置系统的4个标记位: 正, 负, 0, 溢出. 在溢出时, 加法把系统的溢出标记位置1. 然后编译器根据代码来取"负"标记位测试, 将导致测试失败(得不到正确的结果).
而无符号整数是不会溢出的, 所以作者推荐如下的用法:
if ((unsigned int)a + (unsigned int)b > INT_MAX) complain();其中INT_MAX的定义在头文件limits.h中
或者使用如下的方法, 不涉及无符号整数的计算:
if (a > INT_MAX - b) complain();
想看到更好的风景, 不只跟视力有关, 更重要的是: 所站的高度.
References:
C Traps and Pitfalls, ch3.6 Integer Overflow
- "整数相加溢出"引出的思考
- 整数相加溢出判断
- 整数相加溢出判断问题
- 判断两个整数相加是否溢出的方法
- 判断两个整数相加是否溢出的方法
- 判断两个整数相加会不会溢出
- 168题引出的思考
- 判断两个int类型的整数相加,相减是否溢出的C语言代码
- 求N个整数的平均值(注意N可能很大,N个数直接相加会造成整数溢出)
- 由-128的补码引出的思考
- 关于百度MP3问题引出的思考.....
- 关于百度MP3问题引出的思考.....
- 从一个错误引出的思考
- 根据一个笔试题引出的思考
- 由互联网技术引出的一些思考
- 如何判断两个整数相加减是否溢出
- 如何判断两个整数相加减是否溢出
- 无限大的两个整数相加
- _beginThreadex 创建多线程解读
- volatile-内存屏障-互斥锁等-----非常好!
- java BigDecimal的使用
- MINI2440开发板Qt开发环境搭建
- C语言摘要 -- K&R笔记(3)
- "整数相加溢出"引出的思考
- sql关键字的解释执行顺序
- linux下firefox安装flash插件
- CRT函数解读
- 北京邮电大学程序设计课程设计第二次实验problem 6
- 实现虚拟机和宿主机能正常上网,通信
- 百度地图API之ItemizedOverlay的使用(Android)
- 题目1493:公约数
- 酷MM —装饰模式