<Functional>:<long>整数上的加号()给出意外的结果
<Functional>: plus<long>() on integers gives unexpected result
我不明白为什么在这两种情况下我没有得到相同的结果:
#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;
}
有人有什么想法吗?
编辑:正如下面正确指出的那样,这是由于我不指望int中的符号位。 0x7FFFFFFF显然更适合测试。此外,我错误地期望 plus() 的返回类型与 accumulate() 的返回类型相同,但事实并非如此:它基于第三个参数。
这里有两个问题:
-
0xFFFFFFFF数字不适合
int
(假设 32 位int
s),因此在大多数实现中,存储在向量中的值实际上是 -1。使用vector<unsigned int>
或vector<long long>
应该可以解决此问题。 -
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;
}
<</div>
div class="answers">因为您的向量包含类型 int
并且0xFFFFFFFF不适合它。尝试将其更改为 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;
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;
}
编辑:
此外,正如interjay所指出的,第三个参数应该具有类型long long
,因为累积使用它来推断结果类型。
您的vector
存储类型int
,这可能是 32 位类型。从 4.7/3 开始,我们了解到:
如果目标类型是有符号的,则值保持不变(如果可以 以目标类型(和位域宽度)表示;否则 该值是实现定义的。
换句话说,你的值0xFFFFFFFF
不能在目标签名类型中表示,因此结果是实现定义的。在这种情况下,它很可能采用明显的 twos-comp 结果并在向量中存储-1
。然后当你做accumulate
时,它会添加-1
(因为它不会改变存储的-1)和2
,导致1
被打印出来。
很可能您想将long long
存储在向量中(因为您要对大于 32 位可以容纳的值求和),并且如其他答案中所述,您还需要传递0LL
进行累加以强制它推断正确的返回类型。
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中