奇怪的数字转换 C++

Strange Number Conversion C++

所以我有以下代码:

#include <iostream>
#include <string>
#include <array>

using namespace std;

int main()
{
    array<long, 3> test_vars = { 121, 319225, 15241383936 };
    for (long test_var : test_vars) {
        cout << test_var << endl;
    }
}

在 Visual Studio 我得到这个输出:

  1. 121
  2. 319225
  3. -1938485248

在网站 cpp.sh 上执行的相同代码给出了以下输出:

  1. 121
  2. 319225
  3. 15241383936

我希望输出与 cpp.sh 中的输出类似。我不明白 Visual Studio 的输出。这可能很简单;但如果有人能告诉我哪里出了问题,我将不胜感激。它已经成为我真正的烦恼来源。

MSVC 使用了 4Byte long。 C++ 标准只保证 long 至少和 int 一样大。因此 signed long 可表示的最大数目是 2.147.483.647。您输入的内容太大,long 无法保存,您将不得不使用至少 64 位的更大数据类型。

其他编译器使用 64 位宽 long 这就是它在那里工作的原因。

您可以使用 cstdint header 中定义的 int64_t。这将保证签名 int 的 64 位大小。

您的程序将显示为:

#include <cstdint>
#include <iostream>
#include <array>

using namespace std;

int main()
{
    array<int64_t, 3> test_vars = { 121, 319225, 15241383936 };
    for (int64_t test_var : test_vars) {
        cout << test_var << endl;
    }
}