您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据结构与算法 > 实验报告三数据的表示2
计算机系统基础实验报告学院信电学院专业计算机科学与技术班级计算机1401学号140210110姓名段登赢实验时间:一、实验名称:数据的表示2二、实验目的和要求:(1)实验目的:熟悉数值数据在计算机内部的表示方式,掌握相关的处理语句。(2)实验要求:说明你做实验的过程(重要步骤用屏幕截图表示);提交源程序;分析并回答问题。三、实验环境(软、硬件):要求:详细描述实验用的操作系统,源代码编辑软件,相关硬件环境及所使用的GCC编译器的信息。四、实验内容:(1)请说明下列赋值语句执行后,各个变量对应的机器数和真值各是多少?编写一段程序代码并进行编译,观察默认情况下,编译器是否报warning。如果有warning信息的话,分析为何会出现这种warning信息。inta=2147483648;intb=-2147483648;intc=2147483649;unsignedshortd=65539;shorte=-32790;(2)完成书上第二章习题中第40题,提交代码,并在程序中以十六进制形式打印变量u的机器数。(3)编译运行以下程序,并至少重复运行3次。voidmain(){doublex=23.001,y=24.001,z=1.0;for(inti=0;i10;i++){if((y-x)==z)printf(equal\n);elseprintf(notequal\n);x+=z;y+=z;printf(%d,%f,%f\n”,i,x,y);}}要求:(1)给出每次运行的结果截图。(2)每次运行过程中,是否每一次循环中的判等结果都一致?为什么?(3)每次运行过程中,每一次循环输出的i、x和y的结果分别是什么?为什么?五、实验结果及分析:(1)实验分析:机器数就是数字在计算机中的二进制表示形式,其特点一是符号数字化,二是其数的大小受机器字长的限制。将带符号位的机器数对应的真正数值称为机器数的真值inta=2147483648的机器数是10000000000000000000000000000000Bintb=-2147483648的机器数是10000000000000000000000000000000Bintc=2147483649的机器数是10000000000000000000000000000001Bunsignedshortd=65539的机器数无法表示shorte=-32790的机器数无法表示int类型在32位计算机中占4个字节,即32位。又因为正数的补码是其本身,所以int类型能表示的所有正数为:0,0000000000000000000000000000000B到0,1111111111111111111111111111111B即0到+2147483647。而负数的补码是除符号位外各位取反最后加一而来。所以int类型所能表示的所有负数为:0,0000000000000000000000000000000B(-0D的补码)到1,1111111111111111111111111111111B即0到-2147483647D。而32位二进制数能表示的所有值为2的32次方个,而从-2147483647D到+2147483647D总共是2的32次方减一个数,而少的这个数就是10000000000000000000000000000000B(-0D的补码),而任何数的原码都不能在转换成补码时成为这个数,我们人为的把他规定为-2147483648所以int类型的取值范围为-2147483648到+2147483647,所以题目中的b是正确的,并且不会发生溢出。而题目中的a=2147483648其实已经超出int类型的最大范围,但是a=2147483648=2147483647+1=0,1111111111111111111111111111111B+1B=10000000000000000000000000000000B=-2147483648,而-2147483648又在int类型的取值范围内,所以也不会溢出,如果此时打印输出a的十进制就是-2147483648,同理可得c=2147483649=2147483647+2=-2147483647,也不会发生溢出现象。a,b,c的打印输出结果。如下图所示:对于题目中的d,由于它是无符号短整型的变量,在32位机中占两个字节。所以d的取值范围为:0到65535,而65539不在这个范围内,所以会报溢出警告。对于题目中的e,由于它是有符号短整型的变量,在32位机中占两个字节。所以e的取值范围为:-32768到+32767,此时c=-32790=-32768-22=-32768+(-22)=10000000000000000000000000000000B+11111111111111111111111111101001B=000101111111111111111111111111101001B=+6442450921D+32767D所以e会报出溢出警告。(2)实验分析:1)计算机中单精度浮点数的表示方法:1位符号位记作S8位阶码记作E23位尾数记作F其中符号位:0表示正数,1表示负数。8位阶码:8为二进制数可以表示0到255之间的255个值,但是指数不仅有正数,它还有负数,为了处理负指数的情况,让实际的指数值加上一个偏差(Bias,记作B)值作为保存在指数域的值,单精度的偏差值为127,例如如果指数是0,那么8位阶码就是127+0=127=01111111B。位数实际是由24位表示,但是小数点左边的1或0默认是隐藏的,所以位数就成23位了,对于这个隐藏的数字我们记作Y。2)几种浮点数的表示:描述EF规格化浮点数SE≠0&E≠255F非规格化浮点数S00000000F无穷大浮点数S1111111100000000000000000000000NaN非数S11111111F≠03)单精度浮点数所能表示的所有正数的主要临界点描述(Y)SEFB+指数=E零(0)00000000000000000000000000000000-126最小的非规格化数(0)00000000000000000000000000000001-126148-2(0)00000000000000000000000000000010-126…(0)0……-126最大的非规格化数(0)00000000011111111111111111111111-126最小的规格化数(1)00000000100000000000000000000000127-126=1…0………22(1)01000000100000000000000000000000127+2=129…(1)0………最大的规格化数(1)01111111011111111111111111111111127+127=254无穷大(1)01111111100000000000000000000000127+128=2553)看完这个表格,我们还需要明确一下非规格化浮点数的表示才能判断其临界值的大小,例如23-126-149-2*2*12,148-2=-23126-2*2*2,2223-126-127-2*2*22很明显允许的阶数位数E=-126不能满足所需要的阶数-149的需求,这时可能就会在尾数前添加前导0,变成表格中的形式。4)经过上面的分析我们就可以很快找到2的x次方的各种浮点数表示形式的临界值了:(-∞,-150],[-149,-127],[-126,127],[128,+∞]。5)然后题目就可以解出来了:floatfpower2(intx){unsignedexp,frac,u;if(x-149){/*值太小,返回0.0*/exp=0;frac=0;}elseif(x-126){/*返回非规格化结果*/exp=0;frac=1(x+149);}elseif(x128){/*返回规格化结果*/exp=x+127;frac=0;}else{/*值太大,返回+∞*/exp=255;frac=0;}u=exp23|frac;//总共32位returnu2f(u);}(3)六、实验心得通过这三个实验真真正正的让我感受到了计算机世界的逻辑是那么的严谨,也让我看到了计算机进行四则运算的过程,也让我了解了IEEE754标准,总之,通过这次实验让我对计算机的世界有了新的理解,受益匪浅。也让我懂得了编写代码的困难。
本文标题:实验报告三数据的表示2
链接地址:https://www.777doc.com/doc-6446920 .html