Подпись 64 на 32 целочисленного деления

Предполагая, что у вас есть udive инструкции машины, которая делает специальный корпус 64 на 32 без знака деления, взяв (32bit дивиденд & лт; & лт; 32) / 32-битный делитель, мы можем сделать полный 64 по 32 дивизии, используя следующее:

// assume: a / b guaranteed not to overflow
a = 64bit dividend, a.h & a.l are hi & lo 32bits respectively
b = 32bit divisor

q1 = udive(a.h, b)  // (a.h << 32) / b
r1 = -(q1 * b)      // remainder of the above, shortcut since a.h & 0xffffffff == 0
q2 = a.l / b        // a.l / b using regular unsigned division
r2 = a.l - (q2 * b) // remainder of the above
q = q1 + q2
r = r1 + r2

// r < r2, r overflowed and is >32bits, implies r > b since b is 32bits
// r >= b, quotient too small by 1, adjust
if (r < r2) or (r >= b)
    q = q + 1
return q

Однако подписанное дело доставляет мне проблемы. Предполагая эквивалентную инструкцию sdive, которая выполняет подписанную версию udive, я не могу понять, как обращаться с остатками и еще много чего.

Ответы на вопрос(3)

Ваш ответ на вопрос