概述
启文
最近重学C++(为什么不用python、java?因为性能)了解到,C++编程语言很难理解,听说想理解C++语言就需要学习汇编,然后学到原码、反码和补码。或许书本上不是有解释嘛,很多年前看什么是原码反码补码,记下来就可以了,背背就能应付考试。至于计算与、或、异或和非算法很简单,有什么好讲的。刚才百度了一下,很少有真正说清楚了补码的。补码很简单,一个比一个说得复杂,因此写下此文,便于后人学习更容易理解。
正文
CPU只有加法器只能做加法,而且是用01二进制进行加法运算。
减法怎么表示?就需要用到补码,而补码表示的是负数,因此减法就变成了加法。同样乘法源于加法,除法源于乘法,取余取模都是除法得来的,怎么用加法表示?这个问题有多少人思考过?
一个字节8位,可以表示0~255个字符,这里做计算,我们就表示数字,完全是正数,只能表示0到255的数字,若是正负数,通常是-128到127也是256个数字。
负数表示(补码)
补码是原码进行反码化,然后再加1的结果。0的补码是256,256是100000000共有9位二进制位,超过一个字节的表示,所以只取后8位,因此还是0。
上面说的8位二进制表示整数情况,你会说数字不是用ASCII码48表示0,…,57表示9吗?这里面有什么关系?这很好理解,应用平台不一样,一个是代码里面,一个是操作系统,而且只是二进制表示是可以自定义的,并没有固定非要表示什么,别人写的东西,我们用户只能遵守。
减法运算
乘法运算(有点问题见这)
步骤大致如下(详细了解百度然后再看下图)
1.被乘数寄存器、乘数寄存器 、部分寄存器;
2.计算过程中乘数寄存器不会变,被乘数寄存器和部分寄存器变化;
3.根据flag实现加法:被乘数3(0011)最后一位是1,部分寄存器加一个乘数(0101),部分寄存器值为0101;
4.被乘数寄存器和部分寄存器位移:部分寄存器向右位移一位,左补0右去掉,部分寄存器(0010),被乘数寄存器右移一位,溢出一位删除,左边补 部分寄存器移除的数,被乘数寄存器得(1001);
5.重复3,4方法,示例见下图(右边)。
由上图可见,乘数必定不小于被乘数。不然会出现计算错误。
下面负数表示值比较大,计算过程省略,如下:
因为补码的缘故,负数的二进制大于正数。
注意,这个乘法的的计算过程很特别,知道步骤这样,不知道为什么是这样。
除法运算(有点问题改看这)
此除法不适用补码,或许是目前没找到较好的除法器。
结论
基础方法是加法,减法乘法和除法都是后面计算策略问题,解决这个些问题的过程,是算法问题。
最后
以上就是美满羽毛为你收集整理的补码有什么用?的全部内容,希望文章能够帮你解决补码有什么用?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复