源自《The C Programming Language》 P53 pr3-4:
在数的对二的补码表示中,我们编写的itoa函数不能处理最大的负数,即n等于-(2^(字长-1))的情况。请解释原因,
修改函数使得它在任意机器上运行时都能得到正确结果。
代码:
分析:
1, 原因:对于整数的对二补码表示中,所能表示的最大整数值为2^(字长-1) - 1,故不能通过n = -n;
将-(2^(字长-1))转化为2^(字长-1),而是通过abs宏取绝对值的方法abs(n % 10)得到,
比如n = -2147483648(即-(2^(字长-1)),通过abs(n % 10)得到8,这样就绕过了上述
的问题。
2, 参考代码的重点:
(a):用abs(n % 10)而非n = -n来规避当n为最小整数(-2147483648)时。
(b):do-while循环的判断条件用((n / 10) != 0)而非((n / 10) > 0)来避免当n是个负数时
使itoa函数陷入无限循环汇总。