C++ 给我奇怪的结果

C++ give me strange result

我有一个很奇怪的结果运行下面的C++代码:

#include <iostream>

using namespace std;

int main()
{
    int c[]={49,46,48,46,51};
    int p=0;
    for(int i=0;i<5;i++)
         p =p*100+c[i];

    cout << "Hello World! p=" <<p<< endl;
    return 0;
}

Hello World! p=651517355

然而,预期的结果是4946484651。

即使我将数据类型更改为长整数,也给出了同样的错误结果。

我的环境是,

windows 10, Qt Creator 4.14.1 (Qt 5.15.2 MSVC2019 64bit)
cl -c -nologo -Zc:wchar_t -FS -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus -Zi -MDd -W3 -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 -wd4577 -wd4467 -EHsc /Fddebug\aa.vc.pdb -DUNICODE -D_UNICODE -DWIN32 -D_ENABLE_EXTENDED_ALIGNED_STORAGE -DQT_QML_DEBUG -I..\aa -I. -I..\..\..\Qt.14.0\msvc2017\mkspecs\win32-msvc -Fodebug\ @C:\Users\guest\AppData\Local\Temp\main.obj.20080.15.jom
main.cpp

在很多平台上(包括你的,它会出现),intlong int 都是 32 位整数,不能保存值 4946484651。 (标准只规定 long int 不短于 int 并且 至少 32 位宽。)

您需要为 p 使用 long long int,或者更好的是,使用明确的 int64_t 类型:

#include <iostream>
#include <cstdint>

int main()
{
    int c[] = { 49,46,48,46,51 };
    int64_t p = 0;
    for (int i = 0; i < 5; i++)
        p = p * 100 + c[i];

    std::cout << "Hello World! p=" << p << std::endl;
    return 0;
}

输出:

Hello World! p=4946484651
#include <iostream>

using namespace std;

int main()
{
    int c[] = { 49,46,48,46,51 };
    int64_t p = 0;
    for (int i = 0; i < 5; i++)
        p = p * 100 + c[i];

    cout << "Hello World! p=" << p << endl;
    return 0;
}

因为你在 p 中保留相同的大数(大于 2^32)所以它会溢出。