实验分析报告三数据的表示

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验报告三数据的表示
————————————————————————————————作者:————————————————————————————————日期:
计算机系统基础实验报告
学院信电学院专业计算机科学与技术班级计算机1401 学号140210110 姓名段登赢实验时间:
一、实验名称:数据的表示2
二、实验目的和要求:
(1)实验目的:熟悉数值数据在计算机内部的表示方式,掌握相关的处理语句。

(2)实验要求:说明你做实验的过程(重要步骤用屏幕截图表示);提交源程序;分析并回答问题。

三、实验环境(软、硬件):
要求:详细描述实验用的操作系统,源代码编辑软件,相关硬件环境及所使用的GCC 编译器的信息。

四、实验内容:
(1)请说明下列赋值语句执行后,各个变量对应的机器数和真值各是多少?编写一段程序代码并进行编译,观察默认情况下,编译器是否报warning。

如果有warning信息的话,分析为何会出现这种warning信息。

int a = 2147483648;
int b = -2147483648;
int c = 2147483649;
unsigned short d = 65539;
short e = -32790;
(2)完成书上第二章习题中第40题,提交代码,并在程序中以十六进制形式打印变量u 的机器数。

(3)编译运行以下程序,并至少重复运行3次。

void main()
{
double x=23.001, y=24.001, z=1.0;
for (int i=0; i<10; i++) {
if ((y-x)==z)
printf("equal\n");
else
printf("not equal\n");
x += z;
y += z;
printf("%d, %f , %f\n”, i, x, y);
}
}
要求:
(1)给出每次运行的结果截图。

(2)每次运行过程中,是否每一次循环中的判等结果都一致?为什么?
(3)每次运行过程中,每一次循环输出的i、x和y的结果分别是什么?为什么?
五、实验结果及分析:
(1)
实验分析:
机器数就是数字在计算机中的二进制表示形式,其特点一是符号数字化,二是其数的大小受机器字长的限制。

将带符号位的机器数对应的真正数值称为机器数的真值int a = 2147483648的机器数是1000 0000 0000 0000 0000 0000 0000 0000B
int b = -2147483648的机器数是1000 0000 0000 0000 0000 0000 0000 0000B
int c = 2147483649的机器数是1000 0000 0000 0000 0000 0000 0000 0001B
unsigned short d = 65539的机器数无法表示
short e = -32790的机器数无法表示
int类型在32位计算机中占4个字节,即32位。

又因为正数的补码是其本身,所以int 类型能表示的所有正数为:0,000 0000 0000 0000 0000 0000 0000 0000B到0,111 1111 1111 1111 1111 1111 1111 1111B即0到+2147483647。

而负数的补码是除符号位外各位取反最后加一而来。

所以int 类型所能表示的所有负数为:0,000 0000 0000 0000 0000 0000 0000 0000B(-0D 的补码)到1,111 1111 1111 1111 1111 1111 1111 1111B即0到-2147483647D。

而32位二进制数能表示的所有值为2的32次方个,而从-2147483647D到+2147483647D总共是2的32次方减一个数,而少的这个数就是1000 0000 0000 0000 0000 0000 0000 0000B(-0D的补码),而任何数的原码都不能在转换成补码时成为这个数,我们人为的把他规定为-2147483648所以int 类型的取值范围为-2147483648到+2147483647,所以题目中的b是正确的,并且不会发生溢出。

而题目中的a=2147483648其实已经超出int类型的最大范围,但是a=2147483648=2147483647+1=0,111 1111 1111 1111 1111 1111 1111 1111B+1B=1000 0000
0000 0000 0000 0000 0000 0000B= -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)=
1000 0000 0000 0000 0000 0000 0000 0000B + 1111 1111 1111 1111 1111 1111 1110 1001B =0001 0111 1111 1111 1111 1111 1111 1110 1001B=+6442450921D>>+32767D所以e会报出溢出警告。

(2)
实验分析:
1)计算机中单精度浮点数的表示方法:
1位符号位记作S 8位阶码记作E 23位尾数记作F 其中符号位:0表示正数,1表示负数。

8位阶码:8为二进制数可以表示0到255之间的255个值,但是指数不仅有正数,它还有负数,为了处理负指数的情况,让实际的指数值加上一个偏差(Bias,记作B)值作为保存在指数域的值,单精度的偏差值为127,例如如果指数是0,那么8位阶码就是127+0=127=0111 1111B。

位数实际是由24位表示,但是小数点左边的1或0默认是隐藏的,所以位数就成23位了,对于这个隐藏的数字我们记作Y。

2)几种浮点数的表示:
描述 E F
规格化浮点数S E≠0&E≠255 F
非规格化浮点数S 0000 0000 F
无穷大浮点数S 1111 1111 0000 0000 0000 0000 0000 000
NaN非数S 1111 1111 F≠0
3)单精度浮点数所能表示的所有正数的主要临界点
描述(Y)S E F B+指数=E
零(0)0 0000 0000 0000 0000 0000 0000 0000 000 -126
最小的非规格化数(0)0 0000 0000 0000 0000 0000 0000 0000 001 -126 148
-
2(0)0 0000 0000 0000 0000 0000 0000 0000 010 -126
…(0)0 ……-126
最大的非规格化数(0) 0 0000 0000 1111 1111 1111 1111 1111 111 -126 最小的规格化数(1)
0 0000 0001 0000 0000 0000 0000 0000 000
127-126=1

0 … …
… 22(1)
0 1000 0001 0000 0000 0000 0000 0000 000
127+2=129
…(1) 0
… …
… 最大的规格化数(1)
0 1111 1110 1111 1111 1111 1111 1111 111 127+127=254 无穷大(1)
0 1111 1111
0000 0000 0000 0000 0000 000
127+128=255
3)看完这个表格,我们还需要明确一下非规格化浮点数的表示才能判断其临界值的大小,例如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)然后题目就可以解出来了:
float fpower2(int x){unsigned exp,frac,u; if(x<-149){/*值太小,返回0.0*/ exp = 0; frac = 0; }else if(x<-126){/*返回非规格化结果*/ exp = 0; frac = 1 << (x+149); }else if(x<128){/*返回规格化结果*/ exp = x+127; frac = 0; }else{/*值太大,返回+∞*/ exp = 255; frac = 0; } u = exp << 23 | frac;//总共32位 return u2f(u);}
(3)
六、实验心得
通过这三个实验真真正正的让我感受到了计算机世界的逻辑是那么的严谨,也让我看到了计算机进行四则运算的过程,也让我了解了IEEE754标准,总之,通过这次实验让我对计算机的世界有了新的理解,受益匪浅。

也让我懂得了编写代码的困难。

相关文档
最新文档