今天在做leetcode上面一道题目的时候,写了其中这样的一段代码:
Solution s;
cout << s.divide(-1010369383, -2147483648);
return 0;
主要是这个测试例子一直处于死循环。然后我试着将例子放在本地测试的时候,发现vs2013的编译器没通过。具体报错为:
c4146:一元负运算符应用于无符号类型,结果仍为无符号类型
后来查看了MSDN的文档后发现,这个 -2147483648首先计算数字2147483648,这个数字大于 INT_MAX,所以被转换成了unsigned int. 然后将-作用于2147483648后仍为unsigned int 。与我们期望的不同。
知道了这些原因后,按理说将-2147483648改为 -2147483647-1 应该就没有问题了。可以在我的代码中死循环仍存在。 后来单步调试的时候发现在这个语句出现了问题:
long long m = abs(divisor);
这里divisor就是刚传入的-2147483648. 执行完这句后并没有把divisor的绝对值赋给m, m仍为负值。原因其实也很好理解: 这里的divisor被仍为是unsigned int. 故abs没有起作用。 由于abs 返回的结果是int .故又被转换为了-1. 所以m = -1.
改为
long long m = divisor. m = abs(m)
就 可以了。