科学网

 找回密码
  注册

tag 标签: 机器计算

相关帖子

版块 作者 回复/查看 最后发表

没有相关内容

相关日志

炮轰现行的计算机组成原理教材
热度 3 accsys 2018-5-29 06:10
炮轰现行的计算机组成原理教材 姜咏江 前一段时间曾参加过国产 CPU 的的研讨会,各计算机 CPU 设计公司都认为,我们的计算机专业高等教育,培养的人才不适应计算机核心技术的创新发展,所学的计算机原理专业知识似是而非。因而包括计算机专业博士研究生在内,缺乏对计算机核心 CPU 的设计能力。 众所周知,计算机处理器 CPU 是计算机的心脏。 CPU 的设计是包括指令系统在内的计算机整体设计。实际上既包括硬件设计,又包括软件设计。因而,能够设计计算机 CPU 的人必须是计算机原理的精通全才。要解决我国计算机设计人才奇缺的状况,要在计算机核心技术与方法领域超越美国,不像中兴那样被人掐住脖子,就必须有效地培养真正有能力,能够独立设计包括 CPU 在内的计算机专业人才。 为此事,我专门跑到王府井新华书店,实际考察了现在流行的计算机原理教材,或者叫计算机组成原理的大学计算机专业教材。说实话,包括从美国引进的教材在内,都是不系统完备的,特别是在机器计算的设计原理部分,简直就是一笔七拼八凑的糊涂账。 例如,引进的 2017 年 3 月翻译出版【英】艾伦 . 克莱门茨所著《计算机组成原理》(机械工业出版社),仍然胡诌八扯地解释什么“原码、补码、移码、有符号数、符号位、 -0 、 +0…” 等糊涂的问题。国内包括唐朔飞、白中英等人的《面向 21 世纪课程教材 • 普通高等教育 十一五 国家级规划教材 : 计算机组成原理》在内,都是这样一笔糊涂账。 不客气地说,这些著作人很可能没有自己通盘设计过计算机系统,即使有人设计过 CPU ,用这种理论在运算器的设计上也是蹩脚的。在计算机的硬件设计中,数值的表示只需要一种无符号的二进制“限位数”,根本就不需要他们所说的各种码制!计算机硬件组成的二进制数,认为是有符号数还是无符号数,是整数还是小数,这一切都是软件的工作,而不是计算机硬件组成的问题。 对计算机内部硬件数值计算的认识是否正确,是识别你是否真正具有包括 CPU 在内的计算机系统设计能力的试金石。要想使我国的计算机专业大学教育,成为具有世界先进专业水平的教育,赶紧认真系统地编写出一套适合战略发展,能够独立完成从无到有,完整设计出计算机系统的高端人才的教材,不然那种“先进”的愿望不可能实现。 能够培养出自己设计独特架构的计算机人才,才是像样的大学计算机专业。像现在这样的大学计算机专业,无论是清华、北大,还是哈工大,都只能叫“计算机软件专业”而已。计算机专业应该像汽车设计制造专业一样,让学员能够从无到有,自己设计出完整计算机系统。 到了编写出能够设计制造计算机系统的系列教材的时候了(其实国内这已经有人做到了,只是需要教育部门能够认识到)。国外给你的东西不见得都对。在我们自己有能力独立完成这个计算机高科技内容的条件下,再紧跟国外的“愚蠢的理论”,我们岂不是太傻? 建议设立计算机原理与设计一门课程,编写这门课程的教材,可以将汇编程序设计、编译原理、输入输出设计、设备驱动程序设计、操作系统设计原理等课程内容一网打尽,什么总线结构不总线结构,设备接口等,设计当中必然清楚。这样会呈现给学生的是一部完整实在的计算机设计理论和方法。这样做,不但可以将现在零碎的计算机教学内容进行整合,减少不必要的课时和不必学内容,更重要的是能使学生毕业后更有后劲,在计算机设计与制造领域能创造性地发挥自己的才能。 现在设计制作教学计算机的手段与方法十分成熟了,有计算机辅助设计软件 EDA 和方便实现的 FPGA 器件,个人设计制作计算机的问题,已经不是任何问题。 改改我国的无效的计算机专业教材吧。计算机原理的教师们,自己从无到有设计一台哪怕是最简单的计算机系统(不要用人家的开源代码),那才会自己感到真实,无愧于通晓计算机原理课程教师的称号。 2018/5/24
个人分类: 教学笔记|6167 次阅读|8 个评论
无符号正负数?
accsys 2018-5-23 06:50
什么? 无符号正负数? 计算机中所使用的数都是无符号的整数,所有的数值计算都是用整数的加法来完成的。如果你对此还不清楚,那么浏览一下“限位数”理论,你一定会有收获。说不定你从此会爱上计算机的设计。 所谓的限位数,就是用数码排列的固定位数的数。例如 3 位十进制整数 000~999 。限位数为了清楚表示位数,无效 0 不能省略。 用限位数表示实数的方法叫对称制。这要用到“限数”。所谓的限数就是限位数的个数。 3 位十进制数的限数就是 1000 。容易发现,除了 000 之外,两头的限位数相加的结果就是 1000 ,而且是一一对应的。这与正负数的性质有相同之处 (1000 在 3 位限位数中只能是 000) ,于是正负数在计算机中就如此定义了: “除去零,对称地将限位数分成两部分,用较大的对称数表示较小对称数的相反数” 这样一来,用机器进行实数计算的所有问题都解决了。 如果你想详细了解,在网上搜一下“限位数”,就可以得到更多的解释。
个人分类: 机器计算|2600 次阅读|1 个评论
到底什么是冯·诺伊曼结构?
热度 42 accsys 2015-1-16 12:10
到底什么是冯·诺伊曼结构? 姜咏江 有关计算机研究的许多文章都爱将“颠覆了冯·诺伊曼结构”做为标签,进而来说明自己的科研成果是如何的伟大。包括院士们也经常使用这个标签,例如,今年的自然科学一等奖“透明计算”,还有据称为程控交换之父搞的“鲶鱼行动”计算机。 什么是冯·诺伊曼结构?这个问题得稍稍往远点说。在计算机界,人们将开山鼻祖的头衔送给了图灵,实际上真正让机器成为计算机的人应该是冯·诺伊曼(当然也包括那些当年的协同者)。图灵机严格地说,还不能称为计算机,原因是图灵提出的状态集并未进入到机器当中。应该说状态集的元素都是“计算”的结果,而没有反映出机器计算的过程。图灵的伟大在于创造了机器自动输入输出及“状态”存储的思想,为后来者制造实用计算机指明了方向,这是人们将图灵捧上计算机神坛的重要原因。我之所以认为图灵不是计算机的开山鼻祖,是因为图灵的设计并没有实现“机器计算”。 什么是机器计算?用图灵机状态的概念来说,就是得到状态的过程。通俗地说,就是获得结果的机器动作过程。机器的计算能力无论如何应该归功于冯·诺伊曼。有资料说冯·诺伊曼的成就不是他一个人的,这对我们来说已经无关紧要,因为冯·诺伊曼之名代表着计算机诞生的里程碑。如果说图灵解决了机器数据存储和输入输出,那么冯·诺伊曼解决了计算机替代人类脑力劳动的最关键一步,那就是“机器计算”。冯·诺伊曼将机器计算的过程划分为指令、程序和数据,通过现在叫做 CPU 的器件运作,最终得到需要的结果,从而完成了替代人所从事的重复性的脑力劳动。这一伟大的发明当中,最重要的是冯·诺伊曼提出了“程序、数据存储”的思想方法,即将运算的指令程序和数据都存储于计算机的内部,而不是象图灵机那样,存储在外部的带子上,这才是冯·诺伊曼计算机结构的要害之处。现代计算机的各种形式,包括网络结构突破了“程序、数据存储”的思想方法了吗?没有,一个都没有! 不要过多地赞扬将程序存储器和数据存储器分开的“哈弗结构”吧,那只是在冯·诺伊曼伟大思想之下的一个设计改动而已,不要将这种小打小闹的设计改动就叫做“颠覆了冯·诺伊曼结构”。如果这种设计上的小小改进都叫做颠覆,那么我们将无法确认修改和颠覆的区别了吧? 从图灵到冯·诺伊曼是计算机的两个里程碑。用计算机处理多任务引进 OS ,创建多用户计算机,这应该说是第三个里程碑。将单处理器计算机结合通信技术组织成网络,这是第四个里程碑。在网路上创建客户服务器模式应该算五个里程碑。片上多核处理器的引入可以说是第六个里程碑。为了提高计算机的时效,易用、应用的诸多设计理念和方法,多数都是在这些里程碑之下的增光添彩而已。尽管有些设计声势很大,但多数都是为了商业的目的,进行了过分的宣传和夸大。由于冯·诺伊曼声名显赫,硬说颠覆了冯·诺伊曼该有多大的震撼效应!例如,虚拟计算机、云计算、物联网,这些只不过是网络的商业应用的概念炒作而已,哪一个放弃了程序数据存储的做法?这些炒作都没有对上述 6 个里程碑做根本性的改变,因而也成不了计算机发展的里程碑。 冯·诺伊曼等人初期创造的计算机是把程序和数据放到一个存储器当中了,哈弗将程序存储器和数据存储器分开了,这是设计的进步。如果将堆栈存储器也单独设立出来,那也是颠覆吗?其实单独设立存储器的事情是计算机设计的必然过程,指令级并行的流水线程序这些方式为了减少相关,设置了编址的寄存器堆,那是什么?那也是存储器。如今解决数据传输速度的各种缓存,到处都是,能说这些都是在结构上颠覆了冯·诺伊曼吗? 不论何种计算存在,就一定有存储器与之伴随,这就是冯·诺伊曼的程序数据存储的特色。将计算和存储彻底分开?怎样分开?请拿出分开的例子。从根本上讲,存储是记忆运算的基础。离开了存储器,对不起,什么事情也做不了。狭义地理解存储器是大容量的?寄存器算不算?高速缓存算不算? 计算机的里程碑和解决设计应用中的难题是两个概念。能够解决应用难题也是很了不起的事情。例如高性能超级计算机的研发,操作系统的优化,通用性的虚拟技术,方便易用的器件等,任何在空间上的扩充,在时间上的高效,都是计算机科学发展的重要问题。但请不要用“颠覆冯·诺伊曼”说事。 机器计算和存储是相依相随的不可分离的计算机组成部分,机器计算不灭,电子计算机不灭,冯·诺伊曼结构永存。 2015-1-16
个人分类: 随笔|28407 次阅读|146 个评论
机器能够实现精确计算吗?
热度 1 accsys 2014-8-18 09:22
机器能够实现精确计算吗? 姜咏江 我们进行超长的数值计算,总是分段进行的。计算机进行超长位数的数值计算,也要分段进行。由于计算机运算器的位数是固定的,因而段的划分总是按着精确运算器的长度进行,即要在数值长度分段不足运算器长度时,要进行补位。 手工计算的数有小数点和正负号,而机器表示的数既无小数点也无符号。因而用机器进行数值计算就要寻找另外的符号和小数点表达方法。因为任何一个数都可以写成一个整数和一个整数次幂相乘的形式。例如 -26.567 = -26567 × 10 -3 = -26567 × 1/10 3 。 计算机很容易用二进制将这些数字表示出来,但无法表示符号和指数形式。其实解决整数幂的形式也很简单,只要将幂指数表示出来,让底数隐含就可以了。关键的问题是如何表示正负符号。二进制数只有 0 和 1 两个数码,许多书中都说最高位的数码是符号,这是一个严重的概念错误,因为符号是不能直接参加数值运算的。例如按照这种理解,符号 1+1 表示两个负数相加,结果符号位是 0 ,变成了正数。如果认为结果是 10 ,位数扩充了,但机器位数是有限的,最高位的进位已经丢掉了。如果下面还有进位,那么就更难判断结果的正负符号了。实际上二进制最高位 0 和 1 只是与机器表示正负数方法的一种巧合而已。 1. 对称制 那么机器计算如何表示正负数呢?以中国的算盘为例,能否一见到算盘珠(见 图 1 )就知道是正数还是负数? 图 1 10 进制算盘 这个算盘共有 11 位,能够表示的最大正整数是 99999999999 。这种固定位数的数就叫限位数。我们能否就用这 11 位表示正负数呢?办法是这样的:将 00000000000 ~ 99999999999 从中间 50000000000 分开,让以它为对称的两个数表面数值较大的表示较小的相反数。于是 50000000001 就代表 -49999999999 , 50000000002 就代表 -49999999998 , …… 。因为 50000000000 是自身对称的,为了避免二义性,就规定它代表 -50000000000 。于是这个算盘能够表达有符号整数的范围是 。这种规定表示正负数的方法不用添加任何符号,被称为对称制。 对称制如果是偶数进制( 2 、 4 、 6 、 8 、 10 、 …… ),判断一个数实际是正数还是负数,只要比较最高位是否比对称轴的最高位大小即可。例如, 84500000000 的最高位 8 比 5 大,故它表示的是一个负数。 2. 对称制加减法 对称制可以做加减法运算,并且可以用加法运算得到减法运算的结果。我们将用数码表示的限位数直接相加就叫限位数加法。例如 03219876321+20998760452 , 10000000000-88888888888 。 限位数的加法 03219876321+20998760452=24218636773 ,结果正确。而 10000000000-88888888888=10000000000+11111111112=21111111112 ,这是因为 88888888888 实际上是 -11111111112 ,因而才会有上面的等式。可以证明对称制中,“减去一个限位数等于加上它的对称码”,也就是说,在对称制中用加法可以替代减法运算! 3. 怎样快速得到对称码? 两个数码之和为最大数码,那么一个数码就叫另一个数码的反码。一个限位数的每一位数码都是另一个限位数的对应位的反码,那么这两个限位数也互称为反码。可以证明:一个限位数的对称码等于其反码加一。 这样我们要得到一个限位数的对称码就十分容易了不是? 4. 对称制位数扩充 限位数表示数的位数有限,加法运算可能会超出位数,而使实际的数值不对了,这种情况叫溢出。只要我们扩充位数,溢出就不会发生。在对称制中,保持数值不变,可以证明:负数扩充位数左面添“最大数码”,正数添“ 0 ”。例如, 567 扩充成 11 位,则有 567=99999999567, 因为在三位限位数中 567 是 -433 ,而在 11 位的 99999999567 的值也是 -433 。 5. 分段计算 超过机器位数的数可以依据机器的位长,将数按位长分段,高段不足位长的要按照正负数的扩充方法补齐数码,然后将减法变成加法,并分段进位,就可以最后得到准确的结果。 实际上乘除法可以转化成连续的加减法运算,故而用机器的限位数方法可以实现整数的加减乘除运算。如果考虑小数点移位,就可以进行任何用数码表示的实数运算。 6. 总结 用限位数理论和方法可以让机器实现准确的算术运算,而不应认为“机器的位数越长越精确”,那是一种错误的理解。一些书中将二进制数的最高位理解成“正负号”,实际上是将“巧遇”当成“一般”,犯了不求甚解的错误。
个人分类: 计算机科普|4141 次阅读|1 个评论
数学该知道(2)
accsys 2014-3-4 05:52
数是同种属性比较的等级。这就是说不同属性之间没有数。因为比较会有误差,所以数从产生之时就会有误差。即使是同一属性比较,也会由于比较单位不同会产生不同的数。数的计算是在不考虑误差的情况下进行的。因而在实际问题中,不要认为算出来的数就绝对准确。这种认识常常是科研的切入点。
个人分类: 计算机实验|2734 次阅读|0 个评论
限位数除法试商的原则
accsys 2010-12-27 13:11
姜咏江 限位数表示的负数除以正数,首先确定商的有效数码位置。如果被除数有效数码是m位数,除数有效数码是n位,那么商的有效位应是m-n或m-n+1位。例如下例商应有3个有效位。 试商时应遵循数码取大不取小的原则,否则会出错。 竖式的'号是求对称码,可以将+理解成减号,直接做减法。 验算:5410= -459045 = 9675 = -325,而-32545 = -14625,可见误差深远。 2010-12-27
个人分类: 科研讨论|5589 次阅读|0 个评论
有趣的限位数运算
热度 1 accsys 2010-12-26 16:01
姜咏江 只用数码记数没有小数点和正负号,这能够表示正负数吗?这种位数固定的用数码表示的数叫限位数。如数码固定为3位,则3位的数共有1000个。让两个3位数相加为1000的大数表示小数的相反数。例如501是499的相反数-499。全部对是(1,999)(2,998)(498,502)(499,501)(500,500)由于500是对称点,规定500的值是-500。当然0还是0。 这种不用正负号表示正负数的方法叫对称制。对称制3位数大于或等于500的数值都表示负数,4位数大于或等于5000的数值都表示负数,5位数大于或等于50000的数值都表示负数,以此类推。对称制运算超长数码丢失。 趣味一:用加法来计算减法的结果 例题1 计算 451-329。 因为-329是用671表示的,因而 451-329可以用451 + 671计算,由于位数的限制,最高进位1丢失,得451 + 671 = 122。 用一般减法验算:451-329 =122。 趣味二:无符号数相乘得有符号结果 对称制中,负数扩充添9,正数扩充添0。 例题2 753,992的值分别是-247和-008,将它们扩充成6位,直接相乘就可以得到值。 例题3 正负数相乘:833025。 扩充成6位,有 833025 = 999833000025 = 995825 = -004175。 验算:因833= -167,则(-167)25 = -4175。 趣味三:无符号数相除得有符号结果 用限位数表示的异号数可以直接用试商的方法得到有符号结果。负数除以正数,可以如下计算。 例题4 试商计算943632271。 从试商看到943632271得到的999792的值是-208,而943632的值是-56368, 验算知 -56368271 = -208。 这种用无符号数表示负数除以正数的试商运算,由于被除数是负数,故而先要确定商的位数(虚线的位置),虚线左面的添加商码一律为9,其部分积的进位要丢掉。虚线右面的商数与除数的乘积不会丢失进位。 限位数方法可以用到任何进制,它是机器运算的基础。 2010-12-26
个人分类: 教学笔记|4071 次阅读|3 个评论
让孩子必须学会的数学游戏
accsys 2010-12-24 04:57
用无符号数进行有符号数计算 姜咏江 要把孩子培养成科学家,一定要学会机器的计算方法。 先让孩子学会下面的乘法计算吧。 图1是用1、2、3、4、5位数码表示数的对称圆坐标系,内圈标注无符号数,外圈标注有符号数,上半平面是正负数对应变换区,下半平面是正数区。上下平面对称点5、50、500、5000、50000归变换区,因而有正负数对应。图中除去1位数坐标圆全部给出数值标注之外,其他只是给出了对称点和特殊点的坐标标注。 下篇学做除法。 2010-12-24
个人分类: 计算机科普|3847 次阅读|0 个评论
高兴张建伟设计出了动态计算机
accsys 2010-7-7 12:26
姜咏江 昨天是体系结构课程论文答辩的日子,不到8点我就到了机房,盼望学生们能给我满意的答卷。整整一天,15个研究生,除了2个人我要求重写之外,都通过了,而且出现了有水平的工程和论文。 张建伟最终设计出了PMT231动态计算机核,他说:花了很长时间来进行总体设计,才开始动手。一写代码仿真,发现很多初始的想法是有问题的,逐渐改进,经过一周多的时间,才基本完成了动态计算机的实现。这期间有一门考试没有时间看,考的很差。 (小子,你用一周多就能完成,就相当不错了!) 我为这孩子的那一门功课感到惋惜,但我为他能在计算机体系结构的领域中取得成绩感到骄傲!要知道这是我提出动态计算机理论和方法之后,除我之外能够实现动态计算机的第一人。他的工程、论文及答辩我给了97分,是他们之中最高的。 学生都很感谢我传授动态计算机的思想方法,我感谢他们能够独立地实现它。 2010-7-7
个人分类: 教学笔记|3448 次阅读|4 个评论
机器数间的距离
accsys 2010-7-1 10:18
姜咏江 在计算机的浮点数加减运算中需要对阶,需要将阶码小的通过尾数向右移位,使两个浮点数同阶,一般要将阶码小的变成大的阶码。尾数右移的位数是一个正整数,是由两个阶码间的距离来确定的。 两个数之间的距离是由它们的差的绝对值求出的。限位数表达的机器数之间的距离,可以通过限位数减法得到。例如,8位二进制数的阶码范围是 -128~127,只要用较大的阶码减去较小的阶码,得到的差就是阶码间的距离。-128~127范围内距离最大的是255,例如127-(-128)。 限位数间的距离和它们所表示的有符号数间的距离是一致的。例如,8位的二进制数10101100与01011110在对称制中表示的数是-84与94,0101111010101100,用 01011110-10101100 = 01011110+01010100,得到的8位结果是10110010,这是一个无符号数,值为178。而-84与94的距离正是178,可见两个限位数的差得到的无符号数就是它们所代表的数值的距离。这种规律总结出如下的定理。 定理:数值大的限位数与数值小的限位数之差得到的无符号数就是两数值的距离。 下面以二进制浮点数加减运算对阶的实例,说明机器数距离的应用。 设有浮点数a2 m 和b2 n ,m、n是8位二进制数,且mn;a、b是24位二进制纯小数;对称制下a、b、m、n都可为正负。如令m=00111000,n=10000101,那么m-n是b右移的位数,求法如下: m-n = 00111000 10000101 = 00111000 + 01111011 = 10110011 = 179。 实际上m = 56,n = -123,m-n = 179。也就是要将纯小数b右移179位才能与a做加减法运算,而结果的阶码应是00111000。 2010-7-1
个人分类: 教学笔记|3770 次阅读|0 个评论
如何判断机器数的大小
accsys 2010-6-30 17:45
姜咏江 机器数是限位数。随便给出两个机器数怎样判断大小呢? 如果认定是无符号数,那么从高位数码开始,逐一向低位比较,只要某数码较大,那么它所在的数就大。例如,1456280与6460000是无符号数,自然知道64600001456280。 如果认定是有符号数,那么1456280是一个正数,6460000是个负数,因此有64600001456280。 再举一例。 有符号机器数9999102和501谁大谁小呢?判断的方法是将它们先等值变换成相同的位数,然后再进行比较。 由最高位大于等于5是负数知,这是两个负数。故9999102=9102,501=9501,在对称制中同号两数限位数越大,表示的值越大,故91029501 即 9999102501。 实际上,9999102的值是-898,501的值是 -499,根据负数的绝对值较大的反而越小知道机器数9999102501是正确的。 总结一下: 1. 正数大于零和负数; 2. 零大于负数; 3. 符号和位数分别相同的机器数,限位数大的值也大。 此方法适用于任何进制的机器数。 2010-6-30
个人分类: 教学笔记|4644 次阅读|0 个评论
计算机中的反码与反数
accsys 2010-6-29 10:28
姜咏江 一、反码的定义 在任意进制中反码可以如下定义: 两个数码之和是最大数码,那么一个称为另一个的反码 。 例如,十进制的(0,9)(1,8)(2,7)(3,6)(4,5);二进制的(0,1);五进制的(0,4)(1,3)(2,2)等。 二、反数的定义 利用反码,进而可以定义反数: 将一个数的全部数码用其反码替换得到的数叫原数的反数 。 例如,十进制的56023的反数是43976;二进制的10100的反数是01011;五进制43021的反数是01423。 注意,反数不是相反数的。相反数是正负数意义下的概念,而反数是数码对称调换的概念。 有人也许要问:反数有什么用? 反数在计算机变减法运算为加法运算的设计中有着重要的应用。利用反数可以避开做减法得到负数的机器数表示(请参阅四)。 三、反数的性质 反数有什么性质呢? 固定位数的数叫限位数。 限位数中,两个反数之和是最大数 。 因为位数固定的限位数中,每一位数码都是最大数码的数是最大的,根据反数的定义,立即可以得到这个反数的性质。 四、对码 限位数总数一定。例如3位十进制就有1000个数。 两个限位数之和为总数(限数),一个叫另一个的对码 。 对码小的表示正数,大的表示小的相反数,这是对称制 。例如,821表示的是179的相反数(而179=1000-821)。 五、用反数求对码 在对称制中,规定负数用其相反数的对码在机器中表示。例如,3位十进制数821表示的是-179,用821求对码179就可以用求反加一来完成:821 的反数是178,再加1,则为179。我们要读821 的值,先认定821这是一个负数,然后如此求其对码,最后添加-得到数值。 2010-6-29
个人分类: 教学笔记|5750 次阅读|1 个评论
如何快速读出机器数的正负值
accsys 2010-6-29 07:55
姜咏江 用算盘(见图1)做限位数运算如何能够快速地读出数值?这需要记住两点: 1. 所有的位置都表示一位数码; 2. 正负数由算盘的最左面一位确定(大于等于5是负数)。 图 1 十进制算盘的限位数00000000 图2 在一般情况下读出的是限位数70006000。如果认定是对称制的有符号数, 那么读出的应是-29994000。这是用求反加一的口诀读出来的。 图 2读出的数是 -29994000 如果只看这个算盘的上档,那就是二进制的算盘,负数的最高位是1。图1的二进制限位数是00000000,图2 的二进制限位数是10001000。如果按有符号数读出,那么图1仍然是00000000, 而图2 读出的应是 -01111000。 计算机内部设计的运算器如同这里的算盘一样,不论你如何读,其记录的仍然是限位数。要想得到我们需要的数值形式,需要用软件的方法进一步解决。 2010-6-29
个人分类: 教学笔记|4545 次阅读|0 个评论
用机器如何进行正确计算
accsys 2010-6-28 22:06
姜咏江 我在机器如何表示正负数和进行运算中说过了:机器是用限位数的加法来完成一定范围内的正负数加减运算的。用机器设备在某一位置上能够方便地表达出N种状态,那么将这种机器设备n个排列起来,就可以制成n位能表示N进制无符号数的设备。例如只有3位的算盘,每一个位置都可以表示0~9这十个数码,合起来就能够表示000~999这1000个数,无论你怎样拨动算盘珠,也不会再出现新的数。用对称制,仍然是这1000个数,但可以表示的是-500~+499的正负数,这种值是我们读出来的,从机器表达形式来看与表示000~999没有区别。 限位数的总数有限的特性,使我们能够用它们的加法运算达到数值加减的目的,这是一般位数不受限制的表数方法所不能达到的。 限位数的加法运算的结果可能超出表示数值的范围,这叫溢出。作为对称制并不能根据限位数加法的最高位有进位来判断超出范围,而是根据异号两数相加不溢出,同号两数相加结果变号才溢出来判断的。例如 865+600的结果是465(最高进位1丢掉了),因为对称制中500以上的限位数表示的是负数,否则是正数,知两个表示负数的限位数相加的结果得到的限位数表示正数,显然错误。如果将865,600都保值扩充成4位,那么结果表示的值就不会溢出了。 限位数在对称制下保持数值扩充的方法是:正数高位添0,负值高位添最大数码。将865和600保值扩充成4位数,则865=9865=-135,600=9600=-400,那么865+600=9865+9600,这两个限位数相加的结果为9465(最高进位1丢掉了)是一个负数,它表示的值是-535,可见值的运算结果正确。 不细心研究限位数理论的人会感到奇妙,也可能不很理解。然而这是机器数值计算的真正方法,无论采用其他什么样的方式,都必将回归到限位数上来。 2010-6-28
个人分类: 教学笔记|3721 次阅读|0 个评论
机器如何表示正负数和进行运算
accsys 2010-6-24 08:01
姜咏江 用机器来表示数既没有小数点,也没有正负号。由于机器位数的限制,那么直接表达数值的范围总是有限的。例如8位的二进制数只能表示0 ~ 255,或者-128~127。如果有减法运算存在,就只能表示-128 ~ 127,而不能作为无符号数处理。 试想一个10位的算盘,可以用10个位置表示10位的十进制数,无论将小数点的位置如何认定,就只能表示出10 10 个不同的数,不能再多了。如果我们将最高位认定为正负号,那么这一位的算盘珠只要一个就可以了,原因是正负号不能够参加加减运算。同样道理,有限位数的二进制数的最高位也不能认为是符号位,将符号混入加减数值运算的提法真是混沌,更叫人不能容忍的是这居然能够得到计算机界的承认! 用数码表示固定位数的数叫限位数。限位数直观来看就是一个无符号非负整数。要保证非负整数的特征,限位数只能做加法运算,而且运算的结果常常会超出范围。 算术运算是最基本的数值运算,其中乘除法运算可以用多次的加法运算和多次的减法运算代替。尽管如此,要进行数值计算,无论如何也离不开减法,自然就离不开负数如何用机器表示问题。 机器表示负数可不可以像手写那样给前面添加一个-号?强行加上去也可以,但在运算的时候,这一个符号位是不能够直接同数码一样进行运算的。一种巧妙的方法是利用限位数的个数有限性,按照限位数的大小对称地分成两部分(对称规则是两限位数的和是总个数),让表面上小的一部分限位数代表正数,而让较大的另一部分代表负数。相互对称的两个限位数叫对码。让较大部分的限位数代表其对码的相反数,这种用对码表示正负数的规定叫对称制。 在对称制之下,限位数表示的数值就不用+-来表示正负了。还可以通过限位数的加法运算完成它们所代表的数值加减运算。例如,3位的限位数共有1000个, 032的对码是1000-032=968,所以计算045-032时,用968表示-032就将减法运算变成了加法运算,因而045-032 = 045+968,由于3位表示的限制,最高进位丢失,故而限位数相加的结果是013,表示的值正是我们要计算的结果13。 这种求值运算的过程在机器里只能见到045、968和013,而没有+-符号,但一眼就可以知道限位数代表的数值是多少,方法是和对称点的数比较。因为3位十进制限位数的对称点是500,那么显然968是负数了。968的对码是032,根据对称制的规定,968代表的数值是-032。 用限位数加法运算替代数值的加减法运算方便了用机器进行,因为不论什么样的机器表达数的位数都是固定的,这是限位数运算的数值范围有限制的原因。 如何让机器计算能够突破数值范围的限制?下次再谈。 2010-6-24
个人分类: 教学笔记|7015 次阅读|2 个评论

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

GMT+8, 2024-6-2 18:38

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部