在彙編乘法中,32位數字與32位數字相乘,只能是用四次16位相乘表示。
即,int32(a) * int32(b) = (h16(a)+l16(a)) * (h16(b) + l16(b)) 。
現在我們討論下 h16(a) 和 l16(a) 的符號情況
如果a 爲負數, a的31 位, a31 = 1
那麼a = (-a31) * 2^31 + a30 * 2^30 + a29 * 2^29 + ... + a1*2 + a0 * 2^0
如果a爲正數 那麼a的31位 a31 = 0,也可以寫成
那麼 a = (-a31) * 2^31 + a30 * 2^30 + a29 * 2^29 + ... + a1*2 + a0 * 2^0
所以 a 的十進制展開是存在統一的格式的。當然b也就一樣了。
所以
h16(a) = (- a31 * 2^15 + a30 * 2^14 +...+ a17 * 2^1 + a16 * 2^0 ) * 2^16
l16(a) = a15 * 2^15 + a15 * 2^14 +...+ a1 * 2^1 + a0 * 2^0
這樣看來
int32(a) = signed(h16(a)) << 16 + unsigned(l16(a))
int32(b) = signed(h16(b)) << 16 + unsigned(l16(b))
繼續推出
int32(a) * int32(b) = signed(h16(a)) * signed(h16(b)) << 32 + unsigned(l16(a)) * signed(h16(b)) << 16 +
signed(h16(a)) * unsigned(l16(b)) << 16 + unsigned(l16(a)) * unsigned(l16(b))