2012-02-13 61 views
1

我有一个包含整数值的向量,我希望总结。然而,它总结了错误 - 如果矢量在-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 

我难倒;如果有人能够说明为什么我不添加我认为我所添加的内容,我会很感激。

编辑
它是从intunsigned long的铸件。我翻遍了它,按“提交问题”并发现我的错误。虽然,我仍然不明白为什么它正在做它正在做的事情 - 任何光线都会很好 - 为什么,如果我将int添加到unsigned long,它是不是取自int的值?

+0

它的确如此。但负的'int'变成非常大的'unsigned long',然后被添加到你的'temptotal'。 – lapk 2012-02-13 02:45:42

回答

2

不,你正在从你的unsigned long中取出1个,它正在环绕。

此外,使用std::accumulate

result = std::accumulate(readings.begin(), readings.end(), 0); 
+0

我不知道'std :: accumulate' - 谢谢。 – simont 2012-02-13 02:46:47

+1

“accumulate”的一个小问题:如果你加了双打,确保最后一个参数是'0.0',否则模板魔术会认为你正在求和'int's,你会得到奇怪的结果。 – YXD 2012-02-13 02:49:38

+1

类似地,当添加无符号值时,最后一个参数应该是'0U',因为您希望结果也是无符号的。一般来说,'T std :: accumulate(Iter,Iter,T initialValue)'不会试图从'Iter'推导'T',只是使用'T initialValue'。 – MSalters 2012-02-13 12:34:02

2

你问你的编辑,为什么发生这种情况。这是由于内存中整型的二进制表示。

unsigned int简单的情况下,你能想到的任何号作为它的二进制直接表示,这是

1 == 0b1 
2 == 0b10 
... 
42 == 0b101010 

每个数字存储在存储器中的一些数量有限,以及通常是32位(或4字节)的int。这意味着上述表示左边的所有位都是零。

然而,一个int被签名,所以信息必须存储在某个地方。它恰好是Twos complement是二进制符号整数的一种方便的二进制表示(读起来)。它的意思是,int小号

0 = 0b0 
-1 = 0b11111111111111111111111111111111 (32 bits of all ones) 

正如你可能现在意识到,当您将intunsigned int而不是负数,你得到一个非常大的正数,由于这些二进制表示数字。一般来说,除非你确切知道你在做什么,否则你不想在计算中混合无符号和有符号整数。

相关问题