补码运算加减乘除原理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
首先我们来看为什么要使用补码运算法:
因为人脑可以知道第一位是符号位, 在计算的时候我们会根据符号位, 选择对真值区域的加减. (真值的概念在本文最开头). 但是对于计算机, 加减乘数已经是最基础的运算, 要设计的尽量简单. 计算机辨别"符号位"显然会让计算机的基础电路设计变得十分复杂! 于是人们想出了将符号位也参与运算的方法. 我们知道, 根据运算法则减去一个正数等于加上一个负数, 即: 1-1 = 1 + (-1) = 0 , 所以机器可以只有加法而没有减法, 这样计算机运算的设计就更简单了.
于是人们开始探索将符号位参与运算, 并且只保留加法的方法. 首先来看原码:
计算十进制的表达式: 1-1=0
1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2
如果用原码表示, 让符号位也参与计算, 显然对于减法来说, 结果是不正确的.这也就是为何计算机内部不使用原码表示一个数.
为了解决原码做减法的问题, 出现了反码:
计算十进制的表达式: 1-1=0
1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反= [1111 1111]反 = [1000 0000]原 = -0
发现用反码计算减法, 结果的真值部分是正确的. 而唯一的问题其实就出现在"0"这个特殊的数值上.虽然人们理解上+0和-0是一样的, 但是0带符号是没有任何意义的. 而且会有[0000 0000]原和[1000 0000]原两个编码表示0.
于是补码的出现, 解决了0的符号以及两个编码的问题:
1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补= [0000 0000]补=[0000 0000]原
这样0用[0000 0000]表示, 而以前出现问题的-0则不存在了.而且可以用[1000 0000]表示-128:
接下来我们来看补码运算原理:
在计算机里,如果我们要计算5-3的值,我们既可以用5减去3,也可以用5
加上13。这是为什么呢?
这就像我们的钟表,它从1点走到12点之后,又回到了1点。我们的计算机
也是,从0走到15之后,再往下走就又回到了0,就像我们转了一个圈一
样。我们从5这个位置往回退3个格,就完成了5-3这个计算。我们也可以
从5这个位置往前走,一直走到15,这时我们走了10个格,然后我们继续往
前走,走到0,然后到1,然后就走到了2。这样,我们往前走了13个格之
后,也到了2这个位置。
所以说,在我们这个计算机中,减3和加13是一样的。而3+13=16,我们说
在模16的系统下,3和13是互补的。
这样,我们计算5-3就可以换成5+13。3的二进制表示为0011,5的二进制
表示为0101。这样,0101-0011就可以表示为0101+(-0011)。
我们在计算机中都是把负数用其补码表示,-0011的补码就是10000-0011
(即16-3,也就是13)。10000-0011=1+1111-0011=1+(1111-0011)
=1+1100=1101。
我们总说补码是“按位取反再加一”,看了上面这个式子相信大家就会明白
了,其实就是把10000-0011换成了1111-0011再加1的形式。然后,0101-
0011就换成了0101+1101,它们计算出来的结果为10010。由于我们的计算机
只有四个bit,所以结果为0010。即,在模16的计算机中,5-3=5+13=2。
然后是二进制乘法除法原理:
乘法原理:
就是左移(进位)8次,每次最高位为1则加进去,8位移完就得出乘积了
实际上和我们做10进制的乘法是一样的,只不过这里的进制是2罢了
比如5×6,转成二进制就是0101×0110
十进制乘法大家都会做,我们他当成十进制101×110来计算下看看
4位乘积=被乘数×千位被+被乘数×百位+被乘数×十位+被乘数×个位
既0101×0110=101×0000+101×100+101×10+101×0 变化下:
4位乘积=被乘数×千位数×1000+被乘数×百位数×100+被乘数×10位数×10+被乘数×个位数
既0101×0110=101×(0×1000)+101×(1×100)+101×(1×10)+101×0 再变化下:
4位乘积=被乘数×千位数×10×10×10+被乘数×百位数×10×10+被乘数×10位数×10+被乘数×个位数
既0101×0110=101×(0×10×10×10)+101×(1×10×10)+101×(1×10)+101×0=(((101×0)×10)+(101×1))×10+(101×1))×10+101×0 我们可以看到,实际上乘法结果就是被乘数乘以每一位乘以模(10)的N次方的累计和(其实左移位就是进位啦,看得出来吗?)
而换成2进制的话很简单,把10读成二进制2就行了,结果还是:
4位乘积=被乘数×千位数×10×10×10+被乘数×百位数×10×10+被乘数×10位数×10+被乘数×个位数
既0101×0110=101×(0×10×10×10)+101×(1×10×10)+101×(1×10)+101×0=(((101×0)×2)+(101×1))×2+(101×1))×2+101×0
由于乘2就是移位(进位),把上面的公式中乘2换成左移位就行了
二进制数除法运算按下列三条法则:
1、0÷0=0
2、0÷1=0(1÷0是无意义的)
3、1÷1=1
例: (111011)2 ÷ (1011)2算式如下:
1 1 1 0 1 1
÷ 1 0 1 1 商1
----------------------
1 1 1 最后一个1是1110 1 1 “0”后面的1落下来的。
÷ 1 0 1 1 商0
----------------------
1 1 1 1 最后一个1是上面落下来的
÷ 1 0 1 1 商1
-------------------------------
1 0 0 余数100
所以(111011)2 ÷ (1011)2 商为(101)2,余数为(100)2
所谓二进制除法其实一直是在做减法而已。二进制减法向高位借1得2,所以(10)2 - (1)2 = 1