- // the algorithm: first find N such that 2^N * divisor is less than us,
- // then substract divisor from *this - 2^N * divisor as many times as
- // possible
+ if ( divisor == dividend )
+ {
+ quotient = 1l;
+
+ return;
+ }
+
+ // always do unsigned division and adjust the signs later: in C integer
+ // division, the sign of the remainder is the same as the sign of the
+ // dividend, while the sign of the quotient is the product of the signs of
+ // the dividend and divisor. Of course, we also always have
+ //
+ // dividend = quotient*divisor + remainder
+ //
+ // with 0 <= abs(remainder) < abs(divisor)
+ bool negRemainder = dividend.m_hi < 0;
+ bool negQuotient = FALSE; // assume positive
+ if ( dividend.m_hi < 0 )
+ {
+ negQuotient = !negQuotient;
+ dividend = -dividend;
+ }
+ if ( divisor.m_hi < 0 )
+ {
+ negQuotient = !negQuotient;
+ divisor = -divisor;
+ }