有符號二進制數乘法 Signed Binary Number Multiplication

在彙編乘法中,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))

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章