一个非常非常基础的C++问题脑子转不过来了突然
【一个非常非常基础的C++问题脑子转不过来了突然】 我这边编译错误,因为重载机制不明确,2147483648是一个unsigned int类型,对其取负数,结果是回环后的unsigned int类型,编译器不知道该使用哪个重载
至于你这里能运行成功,我猜编译器是把-2147483648当成一个int来算了,abs的逻辑是小于0就取负数,而(int)-2147483648这个取负后会导致int溢出,这个是ub
在x86平台上很多编译器会将这个ub实现为回环,我猜你的2015也是这么干的,于是2147483648强行转为int,结果还是-2147483648,就这样了
----------------------以上原答案
根据评论区的指正,按C和C++标准,这个2147483648应该是按int、long、longlong来匹配,而win用的模型是int和long都是32bit,所以应该是longlong类型,我这边用vs2013,对这个literal判定为unsigned long是有问题的,不知道vs2015是不是有其他问题,所以弄出了这个结果,用gcc试了下,是正常输出2147483648的
学C和C++最好别用vs……
■网友
对于long long,需要llabs。。。。
又算了下,好弱智……
18446744071562067968=0xFFFFFFFF80000000=-2147483648
试了一下又,不用llabs的话程序会认为输入值是long int好像,然后-2147483648就跟上面说的回环回来还是-2147483648。然后按照llu输出,-2147483648就变成了1844674407156206796
long long dividendAbs = llabs(-2147483648);
==============================
#define _CRT_ABS_DEFINED
int __cdecl abs(int _X);
long __cdecl labs(long _X);
=============================
c++ 14的stdlib定义这样,abs后面的输入是int 或者 long int,long long的话需要llabs
这样就行了
推荐阅读
- 同比■同比增长7.1%!2021年的第一个节你花了多少钱?
- “他是我第一个会说普通话的老师”:一对师生折射青海山村蝶变
- 甘肃天水落地脱贫“基础工程”见效累计减贫92.08万人
- 有必要重新开个C店吗
- 大学再有三个月就结束了,没学到知识,参加一个软件测试培训机构好吗
- 汽车|长安UNI-K又将开创一个新的"引力"纪元?
- 神话|武汉传奇父亲:一个平行班孩子创造的高考神话(感动上万家长)
- 王者荣耀李白能不能出肉
- 直播会成为品牌传播的另一个途径么有哪些可行的方法感觉有戏又没头绪好捉急。
- 怎样成为一名合格的Python程序员?
