我的计算中有一些很长的常数用于边界。现在我有一个疲惫的行为,因为有些条件无效,因为这些数字是" 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
任何想法在这里遇到什么问题?
答案 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;