以文本方式查看主题 - 中华农历论坛 (http://bbs.nongli.net/index.asp) -- 历法知识 (http://bbs.nongli.net/list.asp?boardid=2) ---- [推荐]汉语编程中级教材第三章第一节《数摞的概念及表示方法》 (http://bbs.nongli.net/dispbbs.asp?boardid=2&id=16453) |
|||
-- 作者:秦汉昌 -- 发布时间:2008/12/27 19:12:00 -- [推荐]汉语编程中级教材第三章第一节《数摞的概念及表示方法》
一个算盘珠只能表示两种状态,0或1,两个算盘珠可以表示4种状态;算盘珠全部拨下表示0,最右边的珠子单独拨上去表示1,左边的珠子单独拨上去表示2,两个算盘珠都拨上去则表示3。这四种状态分别表示为00,01,10,11。如果要表示更大的数则只有将算盘珠增多。三个算盘珠可以表示8种状态,那么按2的n次方的算法依次类推分别为: 16,32,64,128,256,512,1024,2048,4096,16384,32768,65536,……。 计算机内部数的大小与算盘同样有限,一般将其分为8位、16位、32位、64位等等。为了不至于将运算位取的太大,又能满足于实际应用的要求,对于较早的系统将16位作为一个运算的基本单位,而对于进来的windows系统一般将32位作为一个运算的基本单位。一个16位的数可以表示65536种状态,作为一个16位的正整数,可以从0~65535。但是作为一个有符号的数,则往往用16位最高位为1来表示这个数为负数,这时这个16位的数只能从-32768~+32767范围。而一个32位的数可以表示4294967295种状态, 作为一个32位的正整数,可以从0~4294967295。但是作为一个有符号的数,则往往用32位最高位为1来表示这个数为负数,这时这个32位的数只能从-2147483648~+2147483647范围。对于一个16位的系统其单精度是16位,而双精度是32位;对于一个32位的系统其单精度是32位,而双精度是64位。 上述一个二进制的数可以表达一定的数值范围,但它如何表达这个数的实际值呢?对于一个无符号数,我们可以按上述二进制的算盘记数的方法依次类推,对于16位数的每一种状态找到其从0~65535的对应值;而对于32位数的每一种状态找到其从0~4294967295的对应值。但对于有符号数来说就不能简单地套用这种办法。在有符号数的二进制表示中,我们分别引入原码、反码和补码三种概念。为了简单起见,我们以8位数来说明有符号数三种编码的表示方法。 |
|||
-- 作者:秦汉昌 -- 发布时间:2008/12/27 19:16:00 -- 二、带符号数的表示法 一个数可用其最高位来表示符号,正数的最高位为0,负数的最高位为1,其余位仍然按正常方法表示数值,这种表示方法叫做原码表示法。如: 原码表示简单易懂,而且与机器的真值转换方便。但若是两个异号数相加(或两个同号数相减)就要做减法。为了把上述运算转换为加法运算就引入了反码和补码的概念。 正数的反码表示与原码表示相同,最高位为符号位,用“0”表示正,其余位为数值位。如: 符号位 二进制数值 ( +4) = 0 0 0 0 0 1 0 0 ( +31) = 0 0 1 1 1 1 1 1 (+127) = 0 1 1 1 1 1 1 1 而负数的反码表示,即为它的正数的按位取反(含符号位)。 符号位 二进制数值 ( +4) = 0 0 0 0 0 1 0 0 ( - 4) = 1 1 1 1 1 0 1 1 ( +31) = 0 0 0 1 1 1 1 1 ( - 31) = 1 1 1 0 0 0 0 0 (+127) = 0 1 1 1 1 1 1 1 (- 127) = 1 0 0 0 0 0 0 0 ( +0 ) = 0 0 0 0 0 0 0 0 ( - 0 ) = 1 1 1 1 1 1 1 1 8位二进制数的反码表示有以下特点: 1. “0”有两种表示法。 2. 8位二进制反码所能表示的数值范围为+127~ -128。 3. 当一个有符号数用反码表示时,最高位为符号位。当符号位为“0”(即正数)时,后面的七位为数值部分;但当符号位为“1”(即负数)时,后面几位表示的不是此负数的数值,一定要把它们按位取反,才表示它的二进制值。 二进制表示的另一种方式为补码方式。正数的补码表示与原码表示相同,即最高位为符号位,用“0”表示正,其余位为数值位。如: 符号位 二进制数值 ( +4) = 0 0 0 0 0 1 0 0 ( +31) = 0 0 1 1 1 1 1 1 (+127) = 0 1 1 1 1 1 1 1 而负数的补码表示即为它的反码,且在最后位(即最低位)加1。如: 符号位 二进制数值 ( +4) = 0 0 0 0 0 1 0 0 原码 ( - 4) = 1 1 1 1 1 0 1 1 反码 ( - 4) = 1 1 1 1 1 1 0 0 补码 ( +31) = 0 0 0 1 1 1 1 1 原码 ( - 31) = 1 1 1 0 0 0 0 0 反码 ( - 31) = 1 1 1 0 0 0 0 1 补码 (+ 127) = 0 1 1 1 1 1 1 1 原码 (- 127) = 1 0 0 0 0 0 0 0 反码 (- 127) = 1 0 0 0 0 0 0 1 补码 ( +0 ) = 0 0 0 0 0 0 0 0 原码 ( - 0 ) = 1 1 1 1 1 1 1 1 反码 ( - 0 ) = 1 0 0 0 0 0 0 0 补码 |
|||
-- 作者:秦汉昌 -- 发布时间:2008/12/27 19:19:00 -- 8位带符号的补码表示有以下特点: 1.(+0)= (- 0)= 00000000 2. 8位二进制补码所能表示的数值为:+127~-128 3. 一个用补码表示的二进制数,最高位为符号位,当符号位“(即正数)时,其余七位即为此数的二进制值;但当符号位“1”(即负数)时,其余几位不是此数的二进制值,把它们按位取反,且在最低位加1,才是它的二进制值。当负数采用补码时,就可以把减法转换成加法。例如: 64 –10 =64+(-10)=64+[10]补 +64=01000000 10=00001010 [-10]补=11110110 于是 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 - 0 0 0 0 1 0 1 0 + 1 1 1 1 0 1 1 0 ———————— ———————— 0 0 1 1 0 1 1 0 [ 1] 0 0 1 1 0 1 1 0 自然丢失 一个算盘的位数是有限制的,在做运算时最高位将自行丢失,故做减法与补码相加的结果是相同的。同样我们可以将这种表示法扩展到16位以至32位。计算机中在许多情况下都是用二进制补码的方式表示数值的。汉语编程语言在大部分情况下也用二进制补码表示数值。 补码的巧妙应用使计算机中的加法与减法一致,这无疑在简化计算方法,提高计算机运行效率起了很大的作用。 如果把每个小算盘看作一位数,那么它能表示数的范围是0~15。在我们习惯的十进制表示法中一位数字只能表示0~9,从10开始需用两位以上的数字表示。若想用一位数来表示十以上的数字,则可利用那些最常用的、使用最方便的字符。在十六种状态中,零至九仍用阿拉伯数字0~9表示,而十至十五则用英文字母A~F表示,这就是十六进制表示法。这样上面的每一个小算盘的十六进制表示法就是: |
|||
-- 作者:秦汉昌 -- 发布时间:2008/12/27 19:23:00 -- 从单独一个小算盘很容易看出十六进制与二进制的对应关系。巧妙的是四位二进制数正好是一位十六进制数。这样在识别一个十六进制数代表的二进制状态时,可以按位四位一组进行二进制变换,且变换过程中不会象十进制转换为二进制那样,转换一位而影响其他位。 为了便于理解我们将一个四位小算盘三种数制的对应关系列出: 以后进行二进制与十六进制之间的互相转换,可以根据上面算盘的对应关系来完成。但要进行多位的十进制转换则必须进行计算。 有趣的是中国传统的算盘不仅可以进行十进制计算,同时还可很方便的完成十六进制计算。下面把传统算盘的十六进制表示法列出供大家思考。 算盘的一排珠子可以表示从0~15,即十六进制的一位,也是中国传统十六两制的一位,可见成语中“半斤八两”表示的是二者相等,而不是差不多。 我们可以把一根算盘杆看作为计算机的四位,而两根算盘杆看作为计算机中的八位,专业术语称为“字节”,当以后分析计算机数据结构时你可以将两根算盘杆想象为一个字节。那么上面的算盘正好是计算机中一个64位数。 在第二章我们介绍汉语编程系统的功能及使用时涉及到了数摞的操作。汉语编程为了提高运算速度、优化结构、方便记忆,借鉴中国古代数学算筹的思想,采用了“数摞” 这一特殊方式,将参与运算的数据如同一个个算筹或算盘在计算机内存中有序地摞起来。在运算过程中,自动把摞顶层参与运算的数据删除,并将运算结果重新放回到顶层。这种累加器总是在顶端寄存器的操作方式,实践了无限寄存器这一新的计算机理论。数摞是汉语程序设计语言中的一个重要方式,,本章将着重介绍其具体操作及与之密切相关的算术运算和逻辑运算。 |
|||
-- 作者:秦汉昌 -- 发布时间:2008/12/27 19:26:00 -- 第一节 数摞的概念及表示方法 你可以把计算机想象为一个机械的计算员,当它进行计算时仅有我们上面提到的算盘,而没有纸和笔。在进行大量的数据运算时,为了提高计算速度和便于记忆,最好的办法就是将算盘有序摆放,比如将算盘摞起来。为了保证在一定的空间可以放足够多的算盘,就将参加运算的数据以及结果的算盘都摞放起来。每次总是将参与计算的算盘拿走然后再将表示结果的算盘摞在顶层。例如进行一个最简单的加法运算3+4,我们先将表示3的算盘摞在顶上: 3 : : 横线表示底线,在3和底线之间可能还有以前摞上去的算盘。然后再将表示4的算盘摞在顶上: 4 3 : : 有了两个数后就可以做加法运算,其结果为7。这时参与运算的3和4已经没有用处就将它们移去,再把结果的7摞在顶上。 7 : : 并非只有用移动盘的方法才能解决问题,而修改每个算盘中的内容更简便易行。在计算机内实际也只是修改相应内存的数值,而不能把这些内存地址搬来搬去。为了便于表达,我们称这个摞数的地方为“数摞”。数摞在表示数的时候,总是将最后输入的数放在数摞顶层,而前面输入的数向下顺移。有了数摞的概念,以后我们都按上面的这种方法来进行所有的计算。计算机的运算往往是连续的,前面计算的结果可能是后面运算所需要的参数。如计算(3+4)*5则按上面的方法先将3摞在数摞顶上,再将4摞在数摞顶上:
4 3 : : 做完加法后将4和3去掉,并将7摞在数摞顶上: 7 : : 然后再将5摞在数摞顶上: 5 7 : : |
|||
-- 作者:秦汉昌 -- 发布时间:2008/12/27 19:26:00 --
|