在计算机中,小数点并没有用专门的器件去表示,而是按照一种约定的方式,统一存储在寄存器单元中的。算数逻辑运算单元(ALU)是CPU的组成部分,负责算数和逻辑的运算。那么,ALU究竟是如何工作的呢? 这就是本文主要探讨的内容:
从字面意思来理解,“定点数”就是“点”不动的数。那么究竟是什么“点”不动呢?没错,就是“小数点”。 在上一讲我们说道,不论是整数还是小数,都是有小数点的。整数的小数点表示在最后一位数字的后面,而小数的小数点标识在真值的符号位后面。如图所示:
除了定点数,还有一种数叫做“浮点数”,浮点数将在下一讲展开介绍。
好了,介绍完定点数的基本概念以后,我们展开讲定点数的位移运算和四则运算。定点数的四则运算实际上要比我们想象的复杂的多。 机器并不像人,一眼就知道二二得四,他需要知道2的定点表示形式,然后两个定点数相乘,相乘是有一定的过程的,经过了这个过程,才能得到结果的二进制数,最终输出给我们。我们要做的,就是了解加减乘除究竟经历了什么样子的过程。
不要看移位运算简单,但是它在计算机的运算中的地位是举足轻重的。没有移位运算,也就没有后面的乘除法,乘除法就是在移位运算和加减运算的配合下实现的。 移位运算的规则:虽然正数和负数的移位运算规则不相同,但是相同之处在于移位后正数和负数的符号不变。那么规则就变成了移位运算时,符号位不动,数值位按照如下规则进行移位。
举个例子:
移位的运算是不是很简单?只需要根据规则来就可以了。重点在下面的几种运算中。
定点数的加减运算只需要记住一个原则:加法直接加,减法先变为加法后再计算。 什么意思呢?比如[A+B]补 = [A+B]补,[A-B]补 = [A]补 + [-B]补。 来看两个例子:
溢出的判断:如果计算机的机器字长为4,那么能够表示的真值范围在-8~+7之间,如果两个数相加减,跳出了这个范围,则为溢出。 那么应当如何判断溢出呢? 原则:
乘法的运算方式形成过程,我推荐大家看看计算机专业的教材,即唐朔飞老师的《计算机组成原理》。本文奔着实用性的角度,不会过度发掘计算方法的推导过程,因为我的解释并不如教材上的好。至于真正的计算,不能说是优于教材,最起码你你能够快速上手计算,如果你做到了,那么我的目的也就达到了。 定点数乘法的计算方式:
乘数一栏的上部分数字暂时不用管,仔细看一下运算步骤,和我总结的对比,仔细体会即可。
有了上面的规则,就能够很轻易的根据原码一位乘做出原码两位乘,计算过程:初始化部分积为0,写入乘数,标志位置为0.判断乘数的后两位以及标志位满足何种关系,调用相应的方法移位并设置标志位,最后的结果向右移动两位,根据x和y的符号的异或确定符号。有必要说明的是,两位乘需预留出3位符号位。给出个例子:
这样就非常容易理解了。
给出例子:[x]补 = 0.1101,[y]补 = 0.1011.运算过程如下:
例子:[x]补=0.0101,[y]补=1.0101,求[x*y]补。
这篇文章的内容已经比较多了,为了方便读者消化知识,除法的讲解放在下一篇文章中,敬请期待。
如果你喜欢我的文章,请关注我的微信公众号“最高权限比特流”吧!
【参考文献】《计算机组成原理》,唐朔飞。