C++ 在循环c+中得到奇怪的结果+;

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;

我写了一个非常简单的代码。它工作正常,但为什么我得到了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; 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
可能被证明是错误的