在汇编乘法中,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))