C++ 在循环c+中得到奇怪的结果+;
我写了一个非常简单的代码。它工作正常,但为什么我得到了A1A2A3-110213545。当正确的结果为3192831891时C++ 在循环c+中得到奇怪的结果+;,c++,C++,我写了一个非常简单的代码。它工作正常,但为什么我得到了A1A2A3-110213545。当正确的结果为3192831891时 #include <iostream> #include <cmath> #include <fstream> using namespace std; int main() { for (int a = 41840; a <= 41849; ++a) { for (int b = 37960;
#include <iostream>
#include <cmath>
#include <fstream>
using namespace std;
int main() {
for (int a = 41840; a <= 41849; ++a) {
for (int b = 37960; b <= 37967; ++b) {
for (int c = 0; c <= 1; ++c) {
for (int d = 0; d <= 1; ++d) {
int aa = pow(a, 2);
int bb = pow(b, 2);
int cc = pow(c, 2);
int dd = pow(d, 2);
int A1 = aa+bb+cc+dd;
if (A1 == 3192831891){
/*ofstream myfile;
myfile.open ("result-factor.txt");
myfile << "a " << a << "\n";
myfile << "b " << b << "\n";
myfile << "c " << c << "\n";
myfile << "d " << d << "\n";
myfile << "A1 " << A1 << "\n";
myfile << "===================\n";*/
cout << "a " << a << "\n";
cout << "b " << b << "\n";
cout << "c " << c << "\n";
cout << "d " << d << "\n";
cout << "A1 " << A1 << "\n";
cout << "==========" << "\n";
break;
}
}
}
}
}
return 0;
}
#包括
#包括
#包括
使用名称空间std;
int main(){
对于(int a=41840;a它看起来像整数溢出。int是有符号的,默认为32位,这意味着它可以容纳的最大正数是2^31-1,约为20亿。您的数字大于此值。较大的值在2的补码中变为负数,这就是您看到负数的原因
我建议使用double(双精度浮点),或者如果需要整数,则使用64位整数。hi,也许在调试程序中逐步完成这不是一个“简单代码”,这是非常糟糕的代码。很难阅读和理解它在做什么或它应该做什么。这些变量是用来引起痛苦和痛苦的吗?请使用一些有意义的名称。使用a
,b
,c
会比这一团糟的东西好得多。我已经投票决定关闭它“需要细节或清晰"因为代码是为不可读性而构建的。如果你有问题并寻求帮助,你就有责任以清晰的方式提出问题,这让人们能够解决实际问题,而不是纠结于以大多数人无法理解的方式编写的代码。关于整数平方的一点:编译器是聪明的,而且可以获得smarter,但将整数相乘几乎总是比将它们相乘更快更安全。pow
对浮点数进行操作,浮点数不精确。移动整数->浮点数->整数时,通常会略微损坏数据,因为浮点数不能正确表示整数在计算过程中的某个时刻。谢谢。但是我的数字是10位。10位?!还是不是?而且它工作得很好。我得到了a,b,c,d的正确结果。只有A1是-XXXXX。不知道为什么。一个十进制数字需要多个位。一个位是基2。因此,一个十进制数字需要log(10)/log(2)=3.3219位。因此,最大的10位数字(99999999999)将需要34位来表示。一个有符号的32位整数只能表示31位的正值。再次感谢。旁注:这只是最近(比如今年)默认情况下,C++保证了两个补表示。<代码> int <代码>也不是32位。标准只保证它可以表示一个不小于<代码> -32677 到<代码> 32767 > />的范围。确实,相当一部分的现代编译器提供了32位<代码> int <代码>。16位int
和一些支持64位int
的编译器。在过去,当大多数编译器只支持16位int
时,一些预测声称32位int
不太可能常见,而且随着时间的推移,这种预测结果是错误的。类似地,未来的编译器仍将主要支持32位int
支持32位int
可能被证明是错误的