我相信在C编程的时候都会遇到过这样一段类似的代码:
int n;
...
if (n < 0)
n = -n;
...
乍一看没有什么问题,其实在里面隐藏了一个玄机:n会溢出!
为什么呢?因为n是一个有符号整型,可以表示的范围是(假设这台机器int字长为4)-2^32~2^32-1,负数表示的范围比正数要大1,所以如果n为负,在执行n=-n的过程中就可能出现溢出的情况。
解决这个问题的方法很简单,用一个unsigned int中间变量暂存-n就行了!
下面看一段有关这个问题的函数:atol
long atol(char *s)
{
long r = 0;
int reg = 0;
switch (*s)
{
case '-':
neg = 1;
/*此处没有break语句*/
case '+':
s++;
break;
}
while (*s >= '0' && *s <= '9')
{
int n = *s++ - '0';
if (neg)
n = -n;
r = r * 10 + n;
}
return n;
}
可以看到这个函数也用了n = -n ,但是却没有溢出问题,原因是n的范围只可能是0~9,如果在转换结束之后用n = -n很有可能就会溢出了。
参考:《C陷阱与缺陷》