C库函数abs,声明如下:
int abs(int n);
在32位程序中,
int的范围是: -2147483648~2147483647
其中 -2147483648 的绝对值2147483648超过了int的表示范围.
那么: abs(-2147483648) == ?
大家不妨自己测试下.
如果声明为:
unsigned int abs(int n);
那么这个函数和其他int进行运算,则可能会将其自动转换成unsigned int,
真是两难的处境.
char, short, long 与此类似, 我们需要自己保证参数不是这个特殊值.
建议在处理的时候始终将结果转换成unsigned, 来避免这个问题.
例如 unsigned int y = (unsigned int)abs(x);
这篇文章也是描述这个问题:
http://www.cnblogs.com/soloist/archive/2008/04/15/60517.html