大的负数乘以-1得到负的输出c++

large negative number multiplied by -1 gives output negative c++

本文关键字:输出 c++      更新时间:2023-10-16

为什么这个程序的输出是-2147483648?

#include <iostream>
using namespace std;
int main() {
    long long a=-2147483648;
    a=a*-1;
    cout<<a;
    return 0;
}

它应该是2147483648,因为它在long long的范围内。为什么标志没有改变?我甚至尝试过abs()函数,但结果是一样的。

更令人惊讶的是,这个程序输出2147483648:

#include <iostream>
using namespace std;
int main() {
    long long a=-2147483648;
    a=a*-1;
    a=a*-1;
    cout<<a;
    return 0;
} 

第二次,乘以-1有效。如果重要的话,我使用的是C++4.8.1。

启用-Wall,您就会看到答案。

foo.C:5: warning: this decimal constant is unsigned only in ISO C90

使用-2147483648LL代替常量。

在声明末尾添加'll':

long long a=-2147483648ll;

我在IDEONE上检查了这一点,发现了问题并验证了修复方法。问题是,您的常量值超过了默认int的常量值,因此您必须键入它(只要长度)才能获得所需的常量。

您可能需要将常量限定为:-2147483648LL-C++11应该自动将其升级为long long。再说一遍,long long在C++03中不是标准的。

问题是最小负值为-2147483648,而最大正值为2147483647。请注意两个数字中的最后一个数字。:)因此,值2147483648不能用长-长类型表示,但可以用无符号长-长型表示。例如,函数abs()也存在同样的问题。

当我用g++4.8.1编译它时,它会警告:

warning: this decimal constant is unsigned only in ISO C90

这似乎表明您使用的类型是无符号的。您可以通过在相乘之前输出a的值来确认这一点。使用-std=c++11编译时,使用的类型是有符号的,并且它的行为与您预期的一样。