C中存在两类的整数算术运算:有符号运算和无符号运算.
在无符号运算中是不存在溢出的说法.在有符号运算中就有可能会出现了.如果有有符号运算中存在一个操作数是无符号的.则这时另一个有符号数就会变转换为无符号数.因此也不可能会存在溢出.
若两个操作数都是有符号运算的话.那么就有可能会发生溢出了.
举个很简单的例子(书上的)
如果:a.b是两个非负整型变量.需要检查a+b会不会溢出.
想当然的方式是:
if(a+b<0)
complain();
此时我们可以进行认为在某些计算机上加法运算将检查一个内部的寄存器的四种状态:正.负.零.溢出.
当加法操作:a+b相加--à检查该内部寄存器的标志:负.当然加法操作发生溢出时.这时候的寄存器的状态是溢出而不是负了.则if语句检查失败.
正确的方法:
if((unsigned)a+(unsigned)b>INT_MAX)
complain();
另一种方法:
if(a>INT_MAX-b)
complain();