整数溢出,如何判断整数溢出(没看明白,有空再看)
来源:互联网 发布:淘宝评价置顶规则 编辑:程序博客网 时间:2024/05/18 00:44
整数溢出,如何判断整数溢出 收藏
c语言中存在两类整数算术运算,有符号运算和无符号运算。在无符号运算里,没有了符号位,所以是没有溢出的概念的。
所有的无符号运算都是以2的n次方为模。如果算术运算符的一个操作数是有符号书,另一个是无符号数,那么有符号数
会被转换为无符号数(表示范围小的总是被转换为表示范围大的),那么溢出也不会发生。但是,当两个操作数都是有符号数
时,溢出就有可能发生。而且溢出的结果是未定义的。当一个运算的结果发生溢出时,任何假设都是不安全的。
例如,假定a和b是两个非负的整型变量(有符号),我们需要检查a+b是否溢出,一种想当然的方式是:
if (a + b < 0)
溢出;
实际上,在现实世界里,这并不能正常运行。当a+b确实发生溢出时,所有关于结果如何的假设均不可靠。比如,在某些
机器的cpu,加法运算将设置一个内部寄存器为四种状态:正,负,零和溢出。在这种机器上,c编译器完全有理由实现以上
的例子,使得a+b返回的不是负,而是这个内存寄存器的溢出状态。显然,if的判断会失败。
一种正确的方式是将a和b都强制转换为无符号整数:
if ( (unsigned)a + (unsigned)b > INT_MAX)
溢出;
这里的int_max值为有符号整型的最大值。在一般的编译器里是一个预定义的常量。ANSI C在limits里定义了INT_MAX,值为
2的31次方-1.
不需要用到无符号算数运算的另一种可行方法是:
if (a > INT_MAX - b )
溢出;
PS : 有符号数的最高位(31位)为符号位,最高位为0的时候,表示正,为1的时候表示负。运算时,符号位不参加运算,但是如果两个数相加,30位需要进1时,那么即表示溢出。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/bichenggui/archive/2009/10/27/4734040.aspx
在他空间留言了。看他如何回答
参考以下的讨论:
http://topic.csdn.net/t/20030913/20/2256856.html
- 整数溢出,如何判断整数溢出(没看明白,有空再看)
- 整数溢出,如何判断整数溢出
- 整数溢出,如何判断整数溢出
- 整数溢出,如何判断整数溢出
- 整数溢出,如何判断整数溢出
- 整数相加溢出判断
- 判断整数溢出
- 如何判断整数数据的溢出
- 整数相加溢出判断问题
- 整数溢出
- 整数溢出
- 整数溢出
- 整数溢出
- 整数溢出
- 整数溢出
- 整数溢出
- 整数溢出
- 整数溢出
- 数据库中脚本问题
- 好久没有来了!
- JTree树形结构
- 我是主考官:我要招聘什么样的人
- Ubuntu9.10下eclipse的修正
- 整数溢出,如何判断整数溢出(没看明白,有空再看)
- php 调式方法
- 【FLEX】实现音频播放的波浪效果【转】
- 理解javascript类的实现
- [转帖]Photoshop巧做照片艺术处理:裙摆飞扬
- 测试文字
- 收集关于hibernate的不足
- asp.net网站发布后提示Ambiguous match found
- 异或运算符(xor) 的妙用