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

例如,给定一个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的方式似乎很不一致。二进制补码乘法有一个简洁的数学公式吗?

mmp634174342 回答:处理溢出时是否有一个二进制补码乘法的数学公式?

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

就模块化算术而言,运算的含义也完全相同。用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

本文链接:https://www.f2er.com/2489523.html

大家都在问