Conversion from Unsigned to Signed 16/32/64 bit multiplication




Notation


A is 32 bit data.
A (1111 1111 1111 1111 1111 1111 1111 1111)
0A' (0111 1111 1111 1111 1111 1111 1111 1111)
1/A' (1000 0000 0000 0000 0000 0000 0000 0000)
Z (0000 0000 0000 0000)
Z' ( 000 0000 0000 0000)

Case study


(1) A[31] = 0 B[31] = 0

A * B = 0A' * 0B'

(2) A[31] = 1 B[31] = 1


A * B = ( -231 + 0A') * ( -231 + 0B')
= 0A' * 0B' + 262 - 231 * 0A' - 231 * 0B'
= 0A' * 0B' + 262 - 00A'Z'Z - 00B'Z'Z
= 0A' * 0B' + 262 + 11/A'Z'Z + 1Z'Z + 11/B'Z'Z + 1Z'Z
= 0A' * 0B' + 11/A'Z'Z
+ 11/B'Z'Z + 0100 0000 0000 0000 0000 0000 0000 0001 ZZ
= 0A' * 0B' + 00/A'Z'Z + 00/B'Z'Z + 1100 0000 0000 0000 0000 0000 0000 0001 ZZ

(3) A[31] = 0 B[31] = 1


A * B = 0A' * ( -231 + 0B')
= 0A' * 0B' - 231 * 0A'
= 0A' * 0B' - 00A'Z'Z
= 0A' * 0B' + 11/A'Z'Z + 1Z'Z
= 0A' * 0B' + 00/A'Z'Z + 1100 0000 0000 0000 0000 0000 0000 0000 1Z'Z

(4) A[31] = 1 B[31] = 0


A * B = ( -231 + 0A') * 0B'
= 0A' * 0B' - 231 * 0B'
= 0A' * 0B' - 00B'Z'Z
= 0A' * 0B' + 11/B'Z'Z + 1Z'Z
= 0A' * 0B' + 00/B'Z'Z + 1100 0000 0000 0000 0000 0000 0000 0000 1Z'Z

Summary


Signed 16 bit multiplication result
= 0A' * 0B' + 00/A'Z' * B[15] + 00/B'Z' * A[15] + <11*(A[15]||B[15])>00 0000 0000 000Z'

Signed 32 bit multiplication result
= 0A' * 0B' + 00/A'Z'Z * B[31] + 00/B'Z'Z * A[31] + <11*(A[31]||B[31])>00 0000 Z 0000 000Z'Z

Signed 64 bit multiplication result
= 0A' * 0B' + 00/A'Z'ZZZ * B[63] + 00/B'Z'ZZZ * A[63] + <11*(A[63]||B[63])>00 0000 ZZZ 0000 000Z'ZZZ