C++ C++;带符号整数的Visual Studio weired行为

C++ C++;带符号整数的Visual Studio weired行为,c++,visual-studio,long-integer,signed,C++,Visual Studio,Long Integer,Signed,在我的计算中,有一些长的边界常数。现在我有一个奇怪的行为,因为有些条件是无效的,因为这些数字是“错误解释的” 第一个输出是我想要使用的数字…在输出中,您可以看到-符号被删除,因此我考虑了下溢,但当我添加0时,数字更高,输出是正确的 我正在使用Visual studio 2012 cout<<-2147483648<<endl; cout<<-2147483649<<endl; cout<<-21474836480<<endl

在我的计算中,有一些长的边界常数。现在我有一个奇怪的行为,因为有些条件是无效的,因为这些数字是“错误解释的” 第一个输出是我想要使用的数字…在输出中,您可以看到-符号被删除,因此我考虑了下溢,但当我添加0时,数字更高,输出是正确的

我正在使用Visual studio 2012

cout<<-2147483648<<endl;
cout<<-2147483649<<endl;
cout<<-21474836480<<endl;
cout<<-21474836490<<endl;
cout<<-214748364800<<endl;
cout<<-214748364900<<endl;

你知道这里有什么问题吗?

你应该仔细检查编译器给你的警告消息。如果您的代码不生成警告,那么您应该提高编译器的警告生成级别。MSVC编译器上的此代码将产生两个警告:

警告C4146:应用于无符号类型的一元减号运算符,结果 仍然没有签名

这基本上意味着,编译器将威胁前两个值,即
unsigned int
,然后对其应用一元减号运算符。要解决此问题,应隐式声明值类型:

cout << -(long long)2147483649 << endl;

cout编译器警告不应被忽略

由于不给整数加后缀,编译器对小于int_MAX的值使用
int
,对int_MAX和UINT_MAX之间的值使用
unsigned int
。假设采用2补32位平台,int_MAX为2147483647,因此2147483648和2147483648是无符号的,如警告所述,对无符号类型应用减号仍然会给出正值。因此,结果是由于溢出

正确的方法是在literal后面加上L表示
long
,LL表示
long

cout<<-2147483648LL<<endl;
cout<<-2147483649LL<<endl;
cout<<-21474836480LL<<endl;
cout<<-21474836490LL<<endl;
cout<<-214748364800LL<<endl;
cout<<-214748364900LL<<endl;

couty您的示例甚至没有在VS2012中编译。对于这两行,它失败并显示以下错误消息:
错误C4146:一元减号运算符应用于无符号类型,结果仍然无符号
。thx alot!我甚至必须做long-long-test=-(long-long)2147483648,其中
LL
后缀可能是一种方法(而不是强制转换),如果您使用的是最新的编译器,您可以只做:
auto-value=-214748364900LL
cout<<-2147483648LL<<endl;
cout<<-2147483649LL<<endl;
cout<<-21474836480LL<<endl;
cout<<-21474836490LL<<endl;
cout<<-214748364800LL<<endl;
cout<<-214748364900LL<<endl;