乘以两个整数的奇怪错误

时间:2011-06-29 03:40:45

标签: c++ math operator-overloading

这应该是我的整数类的最后一部分,它似乎很容易,然而,有些事情是错误的。这个代码是否适用于使用2个deques的乘法?

    // 0x12345 = {0x01, 0x23, 0x45}

    integer operator*(integer rhs){
        // long multiplication
        unsigned int zeros = 0;
        std::deque <uint8_t> row;
        std::deque <std::deque <uint8_t> > temp;
        integer out = 0;
        for(std::deque <uint8_t>::reverse_iterator i = value.rbegin(); i != value.rend(); i++){
            row = std::deque <uint8_t>(zeros++, 0); // zeros on the right hand side
            uint8_t carry = 0;
            for(std::deque <uint8_t>::reverse_iterator j = rhs.value.rbegin(); j != rhs.value.rend(); j++){
                uint16_t prod = (uint16_t(*i) * uint16_t(*j)) + carry;// multiply through
                row.push_front((uint8_t) prod);
                carry = prod >> 8;
            }
            if (carry != 0)
                row.push_front(carry);
            out += integer(row);
        }
        return out;
    }

它给了我4931550625 ^ 2 -> 24248133972899962689。假设operator+是正确的,我似乎是,还有其他解释为什么这是错误的

编辑:我根据wxffles更新了代码,但我认为我做错了,因为我仍然得到2424...,而0x25 * 0x25我得到了89 (decimal)

edit2:发布了正确的代码

1 个答案:

答案 0 :(得分:2)

我想你错过了最后一次携带。你不需要:

row.push_front(carry);

就在你将行添加到外面之前?