<Functional>:加上整数的<long>()会产生意想不到的结果

Dav*_*vic 2 c++ g++

我不明白为什么在这两种情况下我得不到相同的结果:

#include <iostream>
#include <vector>
#include <numeric> // for accumulate
#include <functional> // for plus()
using namespace std;

int main() {
    long long i = (long long)  0xFFFFFFFF + 2;
    cout << i << endl;

    vector<int> v;
    v.push_back(0xFFFFFFFF);
    v.push_back(2);

    long long r = accumulate(v.begin(), v.end(), 0, plus<long long>());
    cout << r << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

任何想法?

编辑:正如下面正确指出的那,这是由于我没有指望的int中的符号位.0x7FFFFFFF显然会更好地进行测试.另外,我错误地期望plus()的返回类型与accumulate()的返回类型相同,但情况并非如此:它基于第三个参数.

int*_*jay 6

这里有两个问题:

  1. 数字0xFFFFFFFF将不适合int(假设为32位ints),因此在大多数实现中,存储在向量中的值实际上为-1.使用vector<unsigned int>vector<long long>应该解决这个问题.

  2. 返回accumulate的类型是从第三个参数推导出的类型.自从你进入后0,这将是int.你应该传入,0LL以便它返回long long.

具有这两个修复程序的此程序将返回正确的结果:

#include <iostream>
#include <vector>
#include <numeric> // for accumulate
#include <functional> // for plus()
using namespace std;

int main() {
    long long i = (long long)  0xFFFFFFFF + 2;
    cout << i << endl;

    vector<long long> v; //or vector<unsigned int>
    v.push_back(0xFFFFFFFF);
    v.push_back(2);

    long long r = accumulate(v.begin(), v.end(), 0LL, plus<long long>());
    cout << r << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)