我为什么得到:-9223372036854775808

时间:2016-01-17 01:34:58

标签: c++

#include <iostream>
#include <sstream>
#include <numeric>
#include <math.h>

using namespace std;

int64_t splitAdd(int64_t value) {
    ostringstream intStream;
    intStream << value;
    string intString(intStream.str());
    return accumulate(intString.begin(), intString.end(), 0) - (intString.size() * int64_t('0'));
}

int main(int argc, char *argv[]) {
    int64_t maxPower = 50;
    int64_t results[maxPower];
    for (int64_t tuple = 0; tuple <= maxPower; tuple++) {
        for(int64_t power = 0; power <= maxPower; power++) {
            int64_t value = pow(tuple, power);
            while (value > 9) {
                value = splitAdd(value);
            }
            results[power] = value;
        }
        cout << tuple << endl;
        for (int i = 0; i < maxPower; i++) {
            cout << results[i] << ',';
        }
        cout << endl;
    }
}

过了一会儿,我反复得到了值:-9223372036854775808。我也在Code Runner 2中运行它,不确定这是否会产生影响。

1 个答案:

答案 0 :(得分:7)

一个明显的错误是:

int64_t maxPower = 50;
int64_t results[maxPower];  // <-- Not really legal, but let's pretend
//...
for (int64_t power = 0; 
             power <= maxPower; // <-- Look at the loop constraints
             power++) 
{  
    //....
}
results[power] = value;  // <-- Buffer overrun

由于maxPower为50,因此您正在访问超出范围的元素。这是未定义的行为

另外,要使代码合法C ++,要么声明一个50:

的数组
int64_t results[50];

或声明std::vector<int64_t>

当您这样做并使用at()代替[]时,您可以更好地了解您的计划如何中断。请参阅the Live Example using std::vector here

对于“奇数”,你在这里得到一个数字溢出:

int64_t value = pow(tuple, power);

如果tuple为3,power41,则值会溢出int64_t类型。

也许您需要使用arbitrary precision library(最好是重载必需的数学运算符)或编写自己的,而不是使用“常规”C ++类型。那么你就不会或不应该溢出。