Si bien a signed long long intno se mantendrá A*B, dos de ellos lo harán. Por A*Blo tanto, podría descomponerse en términos de árbol de exponente diferente, cualquiera de ellos adecuado signed long long int.
A1=A>>32;
A0=A & 0xffffffff;
B1=B>>32;
B0=B & 0xffffffff;
AB_0=A0*B0;
AB_1=A0*B1+A1*B0;
AB_2=A1*B1;
Lo mismo para C*D.
Siguiendo el camino recto, la subtracción se podría hacer a cada par de, AB_iy de la CD_imisma manera, usando un bit de acarreo adicional (con precisión un entero de 1 bit) para cada uno. Entonces, si decimos E = A * BC * D, obtienes algo como:
E_00=AB_0-CD_0
E_01=(AB_0 > CD_0) == (AB_0 - CD_0 < 0) ? 0 : 1 // carry bit if overflow
E_10=AB_1-CD_1
...
Continuamos transfiriendo la mitad superior de E_10a E_20(cambia por 32 y suma, luego borra la mitad superior de E_10).
Ahora puede deshacerse del bit de acarreo E_11agregándolo con el signo correcto (obtenido de la parte no transportadora) a E_20. Si esto desencadena un desbordamiento, el resultado tampoco encajaría.
E_10ahora tiene suficiente 'espacio' para tomar la mitad superior de E_00 (shift, add, borre) y el bit de acarreo E_01.
E_10puede ser más grande ahora nuevamente, así que repetimos la transferencia a E_20.
En este punto, E_20debe convertirse en cero, de lo contrario el resultado no encajará. La mitad superior de E_10está vacía como resultado de la transferencia también.
El paso final es la transferencia de la mitad inferior de E_20en E_10otra vez.
Si la expectativa E=A*B+C*Dse ajustara a las signed long long intbodegas, ahora tenemos
E_20=0
E_10=0
E_00=E