补码乘法怎么算(关于补码(有符号)乘法遇到的疑惑)

本文目录
关于补码(有符号)乘法遇到的疑惑
《深入理解计算机系统》第61页
表格第一行的补码-3与3相乘得到的-9不知道是怎么它用补码是怎么计算的。
查了一些资料后发现补码的乘法运算是这样的:
1. 和普通乘法不同,补码乘法需要拓展前面的位,即符号拓展(在表示中添加最高有效位的值的副本),不能默认为0。
2. 因为Y2的权重是-2^(w - 1),所以后面要减去。
所以关于 -3(101)与3(011)乘法步骤如下:
1 0 1
X 0 1 1
---------------------------
1 1 1 1 0 1
1 1 1 0 1
+ 0 0 0 0
-----------------------------
1 1 0 1 1 1
二进制数如何进行乘法运算
1、无符号乘法。
无符号的乘法与加法类似,它的运算方式是比较简单的,只是也可能产生溢出。对于两个w位的无符号数来说,它们的乘积范围在0到(2w-1)2之间,因此可能需要2w位二进制才能表示。
因此由于位数的限制,假设两个w位的无符号数的真实乘积为pro,根据截断的规则,则实际得到的乘积为 pro mod 2w。
2、补码乘法。
与加法运算类似,补码乘法也是建立在无符号的基础之上的,因此我们可以很容易的得到,对于两个w位的补码数来说,假设它们的真实乘积为pro,
则实际得到的乘积为:
U2Tw(pro mod 2w。
上面的式子有一个假设,就是假设对于w位的两个补码数来说,它们的乘积的低w位与无符号数乘积的低w位是一样的。这意味着计算机可以使用一个指令执行无符号和补码的乘法运算。
3、乘法运算的优化。
根据小学所学的乘法运算,假设两个w位的二进制数相乘,则需要进行w次与运算,然后进行w - 1次加法运算才能得到结果。
从此不难看出,乘法运算的时间周期是很长的。因此计算机界的高手们想出了一种方式可以优化乘法运算的效率,就是使用移位和加法来替代乘法。
上述优化的前提是对于一个w位的二进制数来说,它与2k的乘积,等同于这个二进制数左移k位,在低位补k个0。在书中对这一等式进行了证明,过程如下。
这个过程主要应用了无符号编码的公式。
有了上面的基础,就可以使用移位和加法对乘法优化了。
对于任意一个整数y,它总能使用二进制序列表示(假设不超过二进制的表示范围),因此可以将x和y乘积的二进制序列表示为如下形式(此公式在书中没有展现)。
x * y = x * (yw-12w-1 + ... + y020) = (x 《《 w-1) * yw-1 +....+ (x 《《 0 ) * y0。
举个例子,对于x * 17,可以计算x * 16 + x = (x 《《 4) + x ,这样算下来的话,只需要一次移位一次加法就可以搞定这个乘法运算。
而对于x * 14,则可以计算 x * 8 + x * 4 + x * 2 = (x 《《 3) + (x 《《 2) + (x 《《 1) ,更快的方式可以这么计算,x * 16 - x * 2 = (x 《《 4) - (x 《《 1) 。
这里最后需要提一下的是,加法、减法和移位的速度并不会总快于乘法运算,因此是否要进行上面的优化就取决于二者的速度了。
4、二进制乘法的运算步骤。
二进制数乘法过程可仿照十进制数乘法进行。
但由于二进制数只有0或1两种可能的乘数位,导致二进制乘法更为简单。二进制数乘法的法则为:
1、0×0=0。
2、0×1=1×0=0。
3、1×1=1。
例如:1001和1010相乘的过程如下:
由低位到高位,用乘数的每一位去乘被乘数,若乘数的某一位为1,则该次部分积为被乘数;若乘数的某一位为0,则该次部分积为0。
某次部分积的最低位必须和本位乘数对齐,所有部分积相加的结果则为相乘得到的乘积。
参考资料来源:百度百科——二进制乘法
补码乘法
嗳,你这个做算法的方法是错误的,好不!要知道二进制(或机器码)只有在正数的情况下才能运算,(正数与负运算时)都是在正数情况下进行,如果是负数,就将它变为正(负数的补码),然后再进行运算。
1101=+13
1011=+11你的问题都是错的,做对了才怪!
(1)1011--0101
1101
*0101
1101
0000
1101
1000001
最后得(1)10111111
补码1.0101和补码0.1101相乘,怎么计算
首位是符号位,先转化为十进制数。
1.0101的转化,先减1,得1.0100,再把非符号位取反,得1.1011,然后转化成十进制整数指让,就是0.5×1+0.5*0.5*0.5*1+0.5*0.5*0.5*0.5=0.6875。加上符号位,就是-0.6875。
0.1101显然是个整数,补码和原码租逗升相同,所以就是0.8125。
然后相乘,就是-0.55859375,然后转化成二进制,就是-0.10001111。这是原码弊老。

更多文章:
avantage怎么设置为中文(Avantage安装丢失GIT)
2026年10月15日 03:00
activex控件未注册怎么办(登陆视频监控网页时提示activex控件未注册,怎么解决)
2026年10月14日 20:30
excel连接sql数据库教程(excel怎么连接sql数据库)
2026年10月14日 19:40







