Meskipun signed long long inttidak akan bertahan A*B, dua dari mereka akan melakukannya. Jadi A*Bbisa didekomposisi menjadi pohon istilah eksponen yang berbeda, ada yang pas satu 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;
Sama untuk C*D.
Mengikuti dengan cara yang lurus, subraksi dapat dilakukan untuk setiap pasangan AB_idan CD_ijuga, menggunakan carry bit tambahan (akurat integer 1-bit) untuk masing-masing. Jadi jika kita mengatakan E = A * BC * D Anda mendapatkan sesuatu seperti:
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
...
Kami melanjutkan dengan mentransfer bagian atas E_10ke E_20(bergeser sebesar 32 dan menambah, lalu menghapus bagian atas E_10).
Sekarang Anda dapat menyingkirkan bit carry E_11dengan menambahkannya dengan tanda yang benar (diperoleh dari bagian non-carry) ke E_20. Jika ini memicu overflow, hasilnya tidak akan cocok.
E_10sekarang memiliki cukup 'ruang' untuk mengambil bagian atas dari E_00 (shift, tambah, hapus) dan carry bit E_01.
E_10mungkin lebih besar sekarang lagi, jadi kami ulangi transfer ke E_20.
Pada titik ini, E_20harus menjadi nol, jika tidak hasilnya tidak akan sesuai. Bagian atas E_10kosong karena transfer juga.
Langkah terakhir adalah mentransfer bagian bawah E_20ke dalam E_10lagi.
Jika harapan yang E=A*B+C*Dsesuai dengan signed long long intpalka, kita sekarang miliki
E_20=0
E_10=0
E_00=E