CMP设计分享 http://blog.sciencenet.cn/u/accsys 没有逆向思维就没有科技原创。 不自信是科技创新的大敌。

博文

限位数用于运算器设计原理知多少

已有 4192 次阅读 2016-3-28 20:43 |个人分类:机器计算|系统分类:教学心得| 运算器设计, 限位数

限位数用于运算器设计原理知多少

姜咏江

用限位数理论和方法来设计计算机的运算器,就可以让计算机进行丝毫不差的算术运算,即使CPU只有8位的运算器,也不会让超大数值的计算产生丝毫的误差。这对货币发行与计数的银行业来说,其重要性可想而知,更不要说那些利用机器进行精确计算的行业了。本人发现限位数对SAT问题的快速求解也奠定了基础。

1.               什么是限位数?

所谓的限位数,就是限定记数位数,用数码排列得到的数。所谓N进制数是用从0开始的N个数码按照“逢N进一”的规则书写的数。本文仅就基数N是偶数的限位数进行相关讨论,文中使用的Nk一律是正整数。

我们知道N进制的数码共有N个,它们是01@@=N-1)。如果N进制数有k个位置,每个位置可以放N个数码,依据乘法原理,共有Nkk位数。在限位数理论中称kN进制数的个数Nk为限数。因为限数限制了限位数的总数。

N进制的数码是01@@=N-1,那么显然kN进制最大数是由最大数码组成的数。例如,5位十进制的最大数码@=9,最大数99999。而3位十六进制的最大数码是F,那么最大数是FFF

在限位数理论中,如果两个数码的和是最大数码,一个叫另一个的反码;将一个限位数的数码都用其反码替换,得到的数叫原数的反码数。

例如,十进制的反码有5对:(0,9(1,8)(2,7) (3,6) (4,5)。二进制的反码只有一对:(01)。

2.               限位数的特性

为了表明限位数的位数,限位数的每个位置都必须书写数码。根据我们已有的知识,很容易理解限位数的如下特性:

1)限数比最大限位数大1

2)反码数唯一,且和为最大数。

3)限位数加法运算最高进位自动丢失。

4)限位数都是非负整数。

3.               用限位数表示实数

我们一般知道的实数要用正负号和小数点来辅助表示。用机器来进行算术运算,加入正负号和小数点是愚昧的行为。那么用限位数如何表示实数?我们以大家熟悉的十进制来加以说明。

1)对称制

例如,3位的十进制数有0009991000个。如果我们仍然用000表示0,那么可以按着大小从500处等分剩余的那些数,即分为001499501999这两个数量相等的部分。我们还会发现[1,499][501,999]这两部分在数轴上是关于500一一对称的。而[-499,499]又是关于000一一对称的。这样我们就可以让-499-1501999来一一对应代替,如此就可以免去正负号!不仅如此,我们还可以很容易地根据写出的限位数是否比500大来判断所表示的数是正数还是负数。例如,845-155,因为155845关于500对称,而无符号数845大于500,所以845表示的是它的对称数155的相反数-155

我们总不能到数轴上去找对称点吧?研究发现[1,499][501,999]的对称数之间的和都为限位数的总数1000。这一点让我们能够非常容易地确定一个大于500的数所表示的负数是多少。直观会想到用1000-845,再添上负号就可以了。如此,我们就可以用无符号的限位数来表示一定范围内的正负数。由于500的对称数是500,为了避免二义性,就规定它表示的是-500这个数。这样一来,000999就可以用来表示-500499之间的整数。限位数的这种用一定位数的无符号整数表示有符号数的规定,就称为对称制。

一般化,对称制可以如下描述。

将用数码表示的限位数按两数和是限数分成两部分对称,用较大部分数来表示其对称数的相反数,这种表示正负数的方法叫对称制。

你也许会问:“小数如何表示?”

这个问题的解决十分简单,就是只要我们隐含地认定小数点在限位数的第几位之前就可以了,不必用什么符号来记录。

4.               对称制的性质

对称制表数有如下的一些性质。

10没有对称数。

2)限数是限位数的上界,不属于限位数。

3)最大限位数比限数值小1.

4)一个限位数的对称数可以用其反码数加1得出。

5)减去一个限位数可以用其对称数做加法得出结果。

6)对称制表示的实数可以保值扩充位数,正数左面添0,负数左面添最大数码。

不同位数的限位数在对称制下计算,要进行位数扩充,这是是精确计算的保证。当前限位数的表值范围不够用时,扩大位数是基本的方法。例如3位的十进制数只能够表示-500499的整数,如果要用对称制表示-2567这个数,那么就要扩充到4位,用7433表示。如果还要与-18进行加法运算,那么要将-18先表示成2位数的限位数82,然后扩充成9982才行。这样7433+9982的限位数和是7415。而7415表示的值是-2585,正是-2567+(-18)的和。

5.               加减法运算溢出

限位数运算什么时候需要扩充位数?简单地说是在加减法运算溢出的时侯。在对称制下判断溢出很简单。判断如下:

1)同号两数相减和异号两数相加,不会溢出。

2)同号两数相加和异号两数相减,若运算的结果与第一个数符号相同,则不溢出,否则溢出。限位数运算的用“<=>”连接,只有数值相等才用“=”号连接。

例如,587+842<=>429,因为587842都是负数,429是正数,与第一个数587符号不同,因而是溢出的情况。因为两个负数相加的结果不能是正数。这时需要将587保值扩充成9587,将842扩充成9842。于是9587+9842<=>9429

验算:587= -413842= -158-413+(-158)= -571.

        9429= -0571= -571.

6.               机器使用的是二进制

上面我们用大家熟悉的十进制表示数来介绍限位数,在计算机一类的机器计算当中,数是用二进制表示的。因为二进制只有数码01,对称制的对称点是100...0这样的限位数,碰巧比它大的限位数最高位都是1,而比它小的限位数最高位都是0,所以才造成那些不求甚解的人,误认为计算机使用的数有符号位,并且认为最高位的1代表负号,0代表正号。甚至还高出了“正零”和“负零”的说辞。连初中生都知道“零没有正负”,计算机界的国内外专家们居然弄出了正负零,岂不叫人嘘唏。

实际上,在计算机内出现10000000,如果认为是有符号数,那就是-128,绝不是什么“负零”。当然,如果认为是无符号数,那么就是128。请注意,8位二进制数值的范围是-128127,如果是有符号数,8位的运算器表达不出128的。真正能表出128要至少要用9位,即010000000才是。

把计算机内部使用的二进制数最高位理解成“符号位”的人,是不会设计出好的算术运算器的一类人,不管国内还是国外。他们不能解释在计算机内为什么正负数不对称。最糟糕的是,如果运算出现了类似10000...0这样的边界值,他们常会感到莫名其妙。为了表数范围够用,而设计超长位数的运算器是一种愚蠢的做法。

(待续)

2016-3-28

 



https://blog.sciencenet.cn/blog-340399-965607.html

上一篇:SAT无满足解的充分必要条件
下一篇:限位数用于运算器设计原理知多少(续)
收藏 IP: 120.52.24.*| 热度|

2 张骥 liudazhe

该博文允许注册用户评论 请点击登录 评论 (2 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-12-21 23:09

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部