2011-06-26 23 views
0

我想補充的uint8_t兩個列表,就好像入榜個人整數,我得到一些奇怪的值:簡單操作+問題躲避我

0x1000 + 0x100 + 0x10 -> 0x1210 ?????

代碼如下:

// values 0x123456 stored as: {12, 34, 56} 
integer operator+(integer rhs){ 
    // internal list called 'value' 
    std::list <uint8_t> top = value, bottom = rhs.value; 
    if (value.size() < rhs.value.size()) 
     top.swap(bottom); 
    top.push_front(0);       // extra byte for carrying over 
    while (bottom.size() + 1 < top.size())  // match up the byte sizes, other than the carry over 
     bottom.push_front(0); 
    bool carry = false, next_carry = false; 
    for(std::list <uint8_t>::reverse_iterator i = top.rbegin(), j = bottom.rbegin(); j != bottom.rend(); i++, j++){ 
     next_carry = (((uint8_t) (*i + *j + carry)) <= std::min(*i, *j)); 
     *i += *j + carry; 
     carry = next_carry; 
    } 
    if (carry) 
     *top.begin() = 1; 
return integer(top); 
} 

有人能告訴我我做錯了什麼嗎?

回答

2

next_carry = ((*i + *j + carry) > 255);是正確答案,由於額外的1中,由於*i + *j + carry可以等於最小std::min(*i, *j)

+0

+1,剛剛得出同樣的結論。在我的答案中使用了'std :: min'。 – user7116

3

考慮當添加兩個零數字並且沒有進位時會發生什麼。 *i + *j + carry == 0,這是<= than min(*i, *j)。因此,你正在生成一個稀薄的空氣。

如果您知道您只使用字節,您可以將*i + *j + carry存儲在int中,然後進行只是sum/256

3

在您的示例中(0x100 + 0x10),您以carry = false,*top.rbegin() = 0*bottom.rbegin() = 0開頭。當我們落入循環中,我們看到了以下測試:

next_carry = (((uint8_t) (*i + *j + carry)) <= std::min(*i, *j)); 
// given *i == 0, *j == 0, and carry == false 
// this will evaluate to TRUE 

由於next_carry卷繞到你最終carry = true下一此外,當它應該是false 將條件切換爲 < std::min(*i, *j)

+0

哇。那是?我不相信我錯過了 – calccrypto

0

maxval爲最大值uint8_t。如下 確定的next_carry存在:

next_carry = false; 
if(*i == maxval && (*j > 0 || carry)) // excluding *i + carry > maxval case in next if 
     next_carry = true; 
    else 
     if(*i + carry > maxval - *j) /// equal to *i + *j + carry > maxval 
      next_carry = true;