处理溢出时是否存在二进制补码乘法的数学公式?

问题描述 投票:0回答:1

例如,给定字长为4位:

0b1001 * 0b0111 = 0b1111 // -7 * 7 = -1
0b0111 * 0b0111 = 0b0001 // 7 * 7 = 1
0b0111 * 0b0110 = 0b1010 // 7 * 6 = -6
0b1001 * 0b0110 = 0b0110 // -7 * 6 = 6

毫无疑问,这里正在进行一些模块化算法,但是您采用mod的方式似乎很不一致。是否有一个简洁的数学公式来表示二元补码乘法?

math bit multiplication twos-complement
1个回答
0
投票

关于二进制补码的妙处在于,有符号操作数的加,减和乘运算与无符号操作数的运算完全相同(逐位运算),因此计算机无需关心您是否认为它们是否已签名。

同样,就模块化算术而言,运算的含义完全相同。用4个字,当你说:

r = a * b;

您得到r = a * b mod 16。

有符号和无符号之间的唯一区别是我们在脑海中为残数mod 16分配的值。如果我们认为单词为无符号,则值为0-15。但是15 = -1 mod 16,14 = -2 mod 16,依此类推,如果我们认为这些单词是带符号的,那么我们只考虑值-8至7而不是0至15。

您在C,java等中获得的提醒运算符%令人讨厌,它处理负数的方式。如果您想使用该运算符以较大的词来表示4位乘法,则可以说:

a * b =  ( (a * b % 16) + 24 ) % 16 - 8

如果余数运算符“正确地”工作,以使-1%16 == 15,那么您可以写a * b = (a * b + 8) % 16 - 8

© www.soinside.com 2019 - 2024. All rights reserved.