奇怪的数字转换 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 我得到这个输出:
- 121
- 319225
- -1938485248
在网站 cpp.sh 上执行的相同代码给出了以下输出:
- 121
- 319225
- 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;
}
}
所以我有以下代码:
#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 我得到这个输出:
- 121
- 319225
- -1938485248
在网站 cpp.sh 上执行的相同代码给出了以下输出:
- 121
- 319225
- 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;
}
}