我有一个包含整数值的向量,我希望总结。然而,它总结了错误 - 如果矢量在-10和10之间保持10个整数,我的总数不应该是18446744073709551602
。取得std :: vector的总和是使用引用而不是值?
我声明矢量,并用值填充它:
std::vector<int> X;
for (int i = 0; i < readings.size() ; ++i) {
X.push_back(readings[i].x);
我然后总和并显示:
unsigned long temptotal = 0;
for (int i = 0; i < readings.size() ; ++i) {
std::cout << "Value in X: " << X[i] << std::endl;
temptotal += X[i];
}
std::cout << "Temp total: " << temptotal << std::endl;
产生以下输出:Temp total: 18446744073709551603
。
当我步骤通过在GDB求和回路,(在temptotal += X[i];
),I可以print X[i]
:执行相加之前和之后
(gdb) p X[i]
$1 = (reference) @0x100100c80: -1
印刷temptotal
:
(gdb) p temptotal
$2 = 0
(gdb) p temptotal
$3 = 18446744073709551615
我相当肯定,我添加的内存位置,而不是内存位置的值 - 我可能是错误的 - 但我不知道为什么我不添加在X[i]
的值。当我使用readings[i].x
的值填充X
时,它们是double
s,然后我将其输入到int
s。这是我的错误吗?检查在GDB的readings[i].x
值的我喜欢的类型,投应该是int,或者,至少,一些某种:
(gdb) p (int)readings[i].x
$1 = -1
我难倒;如果有人能够说明为什么我不添加我认为我所添加的内容,我会很感激。
编辑
它是从int
到unsigned long
的铸件。我翻遍了它,按“提交问题”并发现我的错误。虽然,我仍然不明白为什么它正在做它正在做的事情 - 任何光线都会很好 - 为什么,如果我将int
添加到unsigned long
,它是不是取自int
的值?
它的确如此。但负的'int'变成非常大的'unsigned long',然后被添加到你的'temptotal'。 – lapk 2012-02-13 02:45:42