error: 整数溢出.c


有朋友问我:整数溢出到底是怎么回事。

C语言中,当两个有符号整数运算的情况下,就可能发生整数溢出。这在其中任何一个操作数为无符号整数的情况下,都是不会发生的。
在a和b是两个非负数的整数类型变量的情况下,如果我们要判断a+b是否溢出,很多朋友会想到用if(a+b<0)的方式。但实际上,真正发生溢出时,这样对结果的猜测性判断,是不可靠的
在某些设备上,加法运算对内部寄存器有4种状态:正、负、零、溢出。这时如果只判断溢出非负,那么这个判断是无效的,因为这时寄存器的状态实际是溢出标志。那么如果我们判断溢出标志呢?那更不可能了,先姑且不说有没有这样一个标志,在寄存器没有溢出状态的设备上,这样肯定是直接无法通过,更别谈运行了。
那么我们到底如何判断整数溢出呢?
其实有一种方式是把a和b强制转换成无符号整型,如下:
if((unsigned)a + (unsigned)b = INT_MAX)
这里INT_MAX是ANSI C标准在limits.h中定义的最大可能整数值,如果没有,我们也可以自行定义它
如果你不想用到如此粗鲁的解决办法,其实也可以用减法这样:
if(a > INT_MAX - b)

到这里,有朋友就要问上火了,为什么只有两个有符号整数运算的情况下,才可能发生整数溢出呢?
因为当其中一个为无符号整型时,另一个操作数也会被自动转换为无符号的形式。这时,所有无符号运算,都是以2的(结果的位数)次方为模来计算。所以只有两个有符号整数运算的情况下,才可能发生整数溢出。

当然这里谈到的溢出与之前提到过的某APP的数据库的int类型(有符号)溢出,是不一样的,这里说的是C语言两操作数运算的情况下的溢出,而非之前提到的数据库里的溢出情况。当然其实溢出的情况还有很多,比如很多初学者写一些程序会出现在for循环等中,内存一不小心就溢出的情况,这些不同情况发生的原因、原理和处理的方式都是不同的,因此这里无法相提并论。

本文讲到C语言两操作数运算的情况下,可能发生的整数溢出的情况,如有疑问欢迎加入Q群564998567与我们交流,如有错误恳请在反馈平台www.snang.cc/bgst/3/指出。如果您方便的情况下,请在微信里关注一下上火者公众号吧!。