在计算机中,小数点并无用专门的器件去表示,而是按照一种约定的方式,统一存储在寄存器单元中的。算数逻辑运算单元(ALU)是CPU的组成部分,负责算数和逻辑的运算。那么,ALU到底是如何工做的呢?
这就是本文主要探讨的内容:微信
从字面意思来理解,“定点数”就是“点”不动的数。那么到底是什么“点”不动呢?没错,就是“小数点”。
在上一讲咱们说道,不管是整数仍是小数,都是有小数点的。整数的小数点表示在最后一位数字的后面,而小数的小数点标识在真值的符号位后面。如图所示:blog
除了定点数,还有一种数叫作“浮点数”,浮点数将在下一讲展开介绍。基础
好了,介绍完定点数的基本概念之后,咱们展开讲定点数的位移运算和四则运算。定点数的四则运算实际上要比咱们想象的复杂的多。
机器并不像人,一眼就知道二二得四,他须要知道2的定点表示形式,而后两个定点数相乘,相乘是有必定的过程的,通过了这个过程,才能获得结果的二进制数,最终输出给咱们。咱们要作的,就是了解加减乘除究竟经历了什么样子的过程。原理
不要看移位运算简单,可是它在计算机的运算中的地位是举足轻重的。没有移位运算,也就没有后面的乘除法,乘除法就是在移位运算和加减运算的配合下实现的。
移位运算的规则:虽然正数和负数的移位运算规则不相同,可是相同之处在于移位后正数和负数的符号不变。那么规则就变成了移位运算时,符号位不动,数值位按照以下规则进行移位。
举个例子:权限
将+26的原码、补码和反码分别左移一位
结果是:[26]原 = [26]反 = [26]补 = 0,0011010,根据规则,原码、反码、补码左移一位的结果是:0,010100二进制
将-26的原码、反码、补码分别左移一位
[-26]原 = 1,0011010,左移一位:1,0110100
[-26]反 = 1,1100101,左移一位:1,1001011
[-26]补 = 1,1100110,左移一位:1,100110方法
移位的运算是否是很简单?只须要根据规则来就能够了。重点在下面的几种运算中。im
定点数的加减运算只须要记住一个原则:加法直接加,减法先变为加法后再计算。
什么意思呢?好比[A+B]补 = [A+B]补,[A-B]补 = [A]补 + [-B]补。
来看两个例子:总结
A = -1001,B = -0101,求[A+B]补
[A+B]补 = [A]补 + [B]补,[A]补 = 1,0111,[B]补 = 1,1011,因此最终的结果是:11,0010,可是这并不是咱们的最终结果,最终结果应该丢掉第一个1,即1,0010.为何呢?这涉及到一个模2运算的问题,若是不想深究只须要记住,一个数只能有一个符号位不是吗?微信公众号
A = -1001,B=-0101.求[A-B]补
[A-B]补 = [A]补 + [-B]补,[A]补=1,0111,[-B]补=0,0101(求法:[-B]补等于[B]补符号位和各位取反,末位加一),这样获得最终的结果,丢弃掉多余的位便可。
溢出的判断:若是计算机的机器字长为4,那么可以表示的真值范围在-8~+7之间,若是两个数相加减,跳出了这个范围,则为溢出。
那么应当如何判断溢出呢?
原则:
乘法的运算方式造成过程,我推荐你们看看计算机专业的教材,即唐朔飞老师的《计算机组成原理》。本文奔着实用性的角度,不会过分发掘计算方法的推导过程,由于个人解释并不如教材上的好。至于真正的计算,不能说是优于教材,最起码你你可以快速上手计算,若是你作到了,那么个人目的也就达到了。
定点数乘法的计算方式:
原码一位乘
原码两位乘:原码两位乘有运算规则,和一位乘有着相似的地方,可是不尽相同。原码两位乘是用两位乘数的部分来决定新的部分如何造成的运算方式。两个二进制数共有四种形态:00,01,10,11,能够表示不一样的移位方式以及加法的方式(下面会看到)。再加上一位标志位C,就能实现更加复杂的操做。如图所示:
有了上面的规则,就可以很轻易的根据原码一位乘作出原码两位乘,计算过程:初始化部分积为0,写入乘数,标志位置为0.判断乘数的后两位以及标志位知足何种关系,调用相应的方法移位并设置标志位,最后的结果向右移动两位,根据x和y的符号的异或肯定符号。有必要说明的是,两位乘需预留出3位符号位。给出个例子:
补码乘法:补码一位乘与原码一位乘相似,区别在于,当乘数为正时,补码乘法运算方法与原码一位乘运算方式相同;当乘数为负数时,补码一位乘前半部分一样和原码一位乘相同,不一样之处是在运算完成后,须要把最终结果加上[-x]补用于校验,才能获得最终的结果。这部分的推导一样能够参见教科书。下面给出一个例子:
补码比较法:相信有了前面的基础,直接给出规则你就可以解决问题了,补码比较法的运算规则以下:
给出例子:[x]补 = 0.1101,[y]补 = 0.1011.运算过程以下:
补码两位乘:补码两位乘和上面的方式没有太多的区别,主要就是两位乘采用三位符号位,三位判断位(乘数的位),有了运算规则,作出题目简直太简单了。
例子:[x]补=0.0101,[y]补=1.0101,求[x*y]补。
这篇文章的内容已经比较多了,为了方便读者消化知识,除法的讲解放在下一篇文章中,敬请期待。
若是你喜欢个人文章,请关注个人微信公众号“最高权限比特流”吧!
【参考文献】《计算机组成原理》,唐朔飞。