C语言编程细节之n=-n的问题

我相信在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陷阱与缺陷》

你可能感兴趣的:(C)