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
在很多平台上(包括你的,它会出现),int
和 long 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)所以它会溢出。
我有一个很奇怪的结果运行下面的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
在很多平台上(包括你的,它会出现),int
和 long 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)所以它会溢出。