一个非常非常基础的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
这样就行了


    推荐阅读