C4146编译错误

今天在做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) 
就 可以了。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值