计算机组成原理-学习笔记(自用,不定时更新)_گ这是一个QQ名字的博客-CSDN博客
源码补码加减法
这个内容比较多从总章节抽离出来单独记录:
首先了解什么是源码:
在此之前了解真值和机器数:
真值:可以正确运算的二进制数(其他进制也行,一般用10进制),可以正确的表示一个数字的大小,表示大小需要用到+-号
比如-1
机器数:(定点数,浮点数)源码就是定点数表示得一种,计算机可以正确识别正负大小的数字,而在计算机中表示正负需要用到0,1在开头表示
比如1000 0001(假设字长8bit)
比如一串源码有(两个正数):A=0000 1110=14,B=0000 0001=1
现在将两个数字相加得C=0000 1111=15
现在将两个数字相减得C=0000 1101=13
可以看出两个正数数字相加减得情况下如果没有超出界限的话它的值是正确的
但是现在我将B改为1000 0001,在重新计算那么结果还是正确的吗
计算=A+B=0000 1110+1000 0001=1000 1111=-15
你会发现我们无法直接用源码正确的相加一个负数数字,也就是说没法用源码直接相加减一个负数数字(但是两个正数好像可以,那么我们将数字直接改成正数,也就是将1变0,+号改成减号)
那如果这样呢,我们将负数化成正数然后在使用减法不也可以吗
很可惜得是:计算机由于制造成本不会给计算机加上减法运算器,只有加法运算器
这时候就很恐怖了,为了省钱,科学家们发明了可以用加法代替减法得方法
现在你看计算式子:0000 1110+1000 0001=1000 1111=-15这不是个错误得结果吗(源码运算)
现在将其改成:0000 1110+1111 1111=0000 1101=13 但是你会发现它神奇得正确了(补码运算)
你会问这个是什么东西这么牛B得吗
没错,这个东西就是补码,两个源码直接相加可能出错,但是两个补码相加就没问题了
那么补码是什么呢:
想象一下,你现在有一个时钟,以12为一个基准,那么某种意义上9相对于12和-3相对于12表示得值是一样得,(简单了解补码和这里得-3和9差不多,以一个基准值相比较,数字可以进行替换,就是本来我9-3是没法计算得,现在将其改成9+21就有可能计算了=30,30相对于12来说就=6)
补码怎么计算:(正数不变)负数:将源码除去符号位得其他数字0变1 ,1变0,最终数字末尾加1,别忘记考虑进位(补码转换成源码也一样,先变数在+1)
反正最终实现得结果就是这样的,现在可以直接用加法表示正负数的相加减了
欸,你不是说不能用减法吗,是的,我们没有减法运算器,但是我们可以将一个源码变成相反的源码,也就是前面加一个负号再求得它得补码
也就是这样得比如:A=0000 1110=14; B=1000 0001=-1
现在计算[A-B]得值
也就是A+-B=0000 1110源+0000 0001源
需要换算成补码即:0000 1110+0000 0001=0000 1111=15
比如 A=0000 1110=14 ;B=0000 0001=1
[A-B]=00001110+1000 0001(源码)
换算补码=0000 1110 +1111 1111=0000 1111=15
此时应该会有人疑惑,为什么符号位也能参与计算:某种意义上来说其实根本就没有符号位,补码只是根据基准值将负数转换成正数罢了,依旧是一个数字那来得正负号,因为在上文中我们已经指出了两个正数相加是没问题得,无论我们怎么转化其实最终都是将两个正数直接相加得结果,这就是为什么正数得补码依旧是原本得值,因为它不需要改变,本来就可以直接参与计算,而负数不一样,我们直接相加负数得时候会出现错误,所以需要将它改成补码,也就是改成相对于基准值来说得正数
比如说9相对于12依旧是9,你确定需要将它在改变一次吗,而-3不一样了需要将它转换成9,在和9相加得18,所以9+-3=6相当于18相对于12等于6
好了补码原理暂时到这里,这里记录下补码转码得一些技巧:一般需要用到得就是补码变成相反数好让我们直接计算减法,比如【A-B】补,一般直接给B得值,我们需要-B得值才好计算
就是【B】补快速转换【-B】补,你可以直接将B补转换成源码在将符号位变位,然后在转换成补码,
第二种就是在【B】补得基础上从右到左找到第一个1,右半部分不变,左半部分取反
假设已知B补=1110 1000,计算-B补
B补=1110 1000,转换:0001 1000
加减法溢出判断
乘法除法 (源码补码乘除法也相当麻烦以后有时间在记录具体细节)
源码乘法
补码乘法