《漫谈计算机组成原理》这个系列的文章共分为两个部分。第一部分围绕着计算机主机的外围硬件,包括总线、存储器、输入输出系统等,这部分的内容已经完成,感兴趣的能够看看以前的文章。以前凡是涉及到CPU的内容,除了第一篇简要的介绍过CPU的工做意外,其余文章都是默认将CPU做为一个“黑盒子”,不涉及到CPU内部的逻辑、运算等问题。而从这篇文章开始,咱们将重点讲述CPU的逻辑、运算、信息处理等的相关知识点。接下来的几篇文章都是写计算机的运算方法的,第一篇文章我着重介绍几个概念——原码、反码、补码及移码,后面的文章就展开看CPU到底是如何被用来计算的。好了,话很少说,开始后半部分的第一讲吧!微信
咱们固然知道,计算机只能识别0和1,也就是咱们所说的机器语言。因此在程序猿进化史中出现过一种很是NB的品种——机器语言程序猿,他们的程序是写在纸带上面的。可是这种生物存在的时间不长(我不知道还有没有真正意义上的机器语言程序猿),就被编译器取代了。由于计算机只能识别0和1,因此在计算机的运算过程当中,参与运算的必然只有0和1两个数字。那么这小小的0和1,到底是如何完成如此复杂多变的操做的呢?cdn
在说原码以前,咱们必须提一下计算机中参与运算的两类数(由0和1组成的“数字”),无符号数和有符号数。无符号数就是没有符号的数,如0001,有符号的数就是有符号的数,如+1000一、-0010等。此外,**无符号数和有符号数的表示范围并不相同,无符号数表示的范围是0 ~ 65535,即0~ 2^16^ -1;有符号数的表示范围是-32768 ~ +32767,虽然范围不一样,可是表示的数据都是2^16^个。**除此以外,无符号数和有符号数的另外一个重要的不一样点就是在寄存器中的存放方式:无符号数能够直接存放在寄存器中,可是有符号数是有符号位的,因此须要连同符号位一块儿保存在寄存器中。+和-是两种状态,0和1也是两种状态,因此+对应0,-对应1,存储到寄存器中就很简单了。 【注】原码、反码、补码、移码均属于有符号数。blog
原码能够说是计算机中最简单的、也是一种最基本的数据表达形式,好比-0001,符号位是-,因此第一位就是1,而真值位就是-0001的绝对值,即0001,因此-0001的原码就是10001。 由于原码多是整数的原码,也有多是小数的原码,这就形成了一个问题——**该如何表示原码中的小数点,即使是整数也有小数点。**整数的原码很好表示,符号位和真值位之间由逗号分割,小数位在真值后,能够不写出来,即表示为1,0001。至于小数的原码,小数点就表示为小数点。如-0.11001,表示为1.11001。 原码表示方式的总结 教科书式的表示方式是在是让人眼花缭乱(我的认为),我在这里直接用文字表述原码的表示方式。编译器
你可能没有听过补码,可是确定听过补角。若是说两个角互补,那么这两个角的角度相加确定是180度的。以下图所示: it
角A:120°,角B:60°,两角之和为180°。这就是补角的概念。 可是补码和补角略有不一样。补码是一种有模的数据,是有正负的。如:当前钟表表示时间为6:00,想要让时间表示为12:00,我既可让时针逆时针调整6个小时,也能够顺时针调整6个小时,若是顺时针记为+,逆时针记为-,则+6和-6所达到的效果是一致的。咱们就称+6和-6是以12为模的补数。因此,咱们可使用+6来代替-6,也能够用+9来代替-3(一样是12为模)。 补码也是一样的道理,就是用一个正数来替代一个负数。为啥要这样作呢?由于这能够减小一种运算,就是减法运算。这样就可使计算机的运算,不论加减,都能当作加来运算。可是乘除不能转换。 关于补码的表示,规则以下:io
反码存在的意义:在原码和补码的互相转换过程当中起到一个过渡的做用。 反码的表示更加简单:编译
移码颇有用,具体做用就是比较大小。 下面两个数:1,0001和0,0001,判断大小。乍一看,好像是1,0001>0,0001。可是你别忘了,1,0001但是负数…… 这个问题就很是好玩了,这种简单的数对于人其实还好判断一些,可是对于计算机,他并不能像人同样思考。 若是咱们这样作:将1,0001和0,0001都加上一个0,1111,最终的结果都成为符号相同的数了,确定是很是比如较的了。 因此,[x]~移~ = 2^n^ + x(x是真值,n是整数x的位数,小数没有移码) 这样,咱们就能很好的判断数据的大小了。 若是你亲自计算了,你会发现:正整数的移码和补码只相差了一个符号位。class
这篇文章是后续文章的基石,相对简单。你们只须要记住数据的原码、反码、补码的运算便可,移码属于了解范畴。 若是你喜欢个人文章,欢迎关注微信公众号:最高权限比特流。 原理