C ++ Visual Studio已经签名的整数

时间:2016-04-13 10:22:33

标签: c++ visual-studio long-integer signed

我的计算中有一些很长的常数用于边界。现在我有一个疲惫的行为,因为有些条件无效,因为这些数字是" miss解释" 第一个输出是我想要使用的数字....在输出中你可以看到 - 符号被删除,所以我想到了一个下溢,但是当我添加一个0,所以数字更高,输出是对的....

我正在使用Visual Studio 2012

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

如您所见,在前两行中删除了 - 符号

2147483648
2147483647
-21474836480
-21474836490
-214748364800
-214748364900

任何想法在这里遇到什么问题?

2 个答案:

答案 0 :(得分:2)

编译警告不得忽略!

由于没有为整数litterals添加后缀,编译器会将int用于小于INT_MAX的值,并使用unsigned int用于INT_MAX和UINT_MAX之间的值。假设一个2补码32位平台,INT_MAX是2147483647,所以2147483648和2147483648是无符号的,正如警告所说,对无符号类型应用减号仍然给出正值。所以结果是由于溢出造成的。

正确的方法是使用long的L和long long的LL为后缀添加后缀:

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

答案 1 :(得分:1)

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

  

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

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

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