实验二数据表示实验.docx
《实验二数据表示实验.docx》由会员分享,可在线阅读,更多相关《实验二数据表示实验.docx(12页珍藏版)》请在冰豆网上搜索。
实验二数据表示实验
深圳大学实验报告
课程名称:
计算机系统
(2)
实验项目名称:
数据表示实验
学院:
专业:
指导教师:
罗秋明
报告人:
学号:
班级:
实验时间:
2017年3月31日
实验报告提交时间:
2017年4月13日
教务处制
一、实验目标:
1.了解各种数据类型在计算机中的表示方法
2.掌握C语言数据类型的位级表示及操作
二、实验环境:
1.计算机(IntelCPU)
2.UbuntuLinux操作系统
三、实验容与步骤
1、根据bits.c中的要求补全以下的函数:
intbitXor(intx,inty);
inttmin(void);
intisTmax(intx);
ntallOddBits(intx);
intnegate(intx);
intisAsciiDigit(intx);
intconditional(intx,inty,intz);
intisLessOrEqual(intx,inty);
intlogicalNeg(intx);
inthowManyBits(intx);
unsignedfloat_twice(unsigneduf);
unsignedfloat_i2f(intx);
intfloat_f2i(unsigneduf);
2、在Linux下测试以上函数是否正确,指令如下:
*编译:
./dlcbits.c
*测试:
makebtest
./btest
四、实验结果
1.intbitXor(intx,inty);
由离散数学逻辑命题逻辑可得,异或如下:
2.inttmin(void);
最小值为0x80000000,由1左移31即可得到:
3.intisTmax(intx);
最大值为0x7fffffff,加一会变为0x10000000,而此数加上本身后会变为0,本身加本身为0的数只有0和0x10000000,故而再将0xffffffff排除即可
4.intallOddBits(intx);
只有所有奇数位为1的数(二进制),与0x55555555进行&运算才会得到0,故而需要得到0x55555555即可,将0x5分别左移4、8、16、24得到4个数,然后将这四个数和0x5相加即可得到0x55555555
5.intnegate(intx);
取反加1即可
6.intisAsciiDigit(intx);
x需要>=’0’且<=’9’,将x与临界点作差,然后判断符号位的为0还是1即可
7.intconditional(intx,inty,intz);
首先使用t=!
x,当x为0时返回1,当x不为0时,返回0,根据题意得到(_&y)|(_&z),首先空1,当x不为0,即t=0时,需要t转换为0xffffffff(-1),当t=1时,需要将t转换为0x0(0),,将t-1即可,得到空1为“!
x+~1+1”,同理空2为“~!
x+1”
8.intisLessOrEqual(intx,inty);
直接用y-x可能会超出int的表示围,故而:
A、在x与y同号的情况下转换为p=y-x>=0,然后p符号位(p>>31)&1为0则返回1,符号位1则返回0;
B、异号时,只要x>=0,就要返回0,否则返回1,由(x>>31)&1能达到该效果;
C、c=a+b可作为x,y同号异号的判断。
9.intlogicalNeg(intx);
令y=~x+1,考虑x与y的符号位:
A.当x为0时,两者符号位都为0;
B.当x=0x80000000时,两者符号位都为1;
C.否则,两者符号位为01或10;
D.根据离散数学的真值表得出(~x)&(~y).
10.inthowManyBits(intx);
11.unsignedfloat_twice(unsigneduf);
12.unsignedfloat_i2f(intx);
A.用(二进制)科学计数法表示int型数时,尾数位数<=23,例如0x00008001,此时将0x8001左移24-16=8位得到frac,而exp则127+16-1;
B.当尾数位数>23时,找到位数最末一位记作x[i],然后对尾数的舍去分3种情况考虑,初始化c=0:
a)当x[i-1]=1且x[i-2]、x[i-3]…x[0]都为0(即要偶端舍入情况),且x[i]=1,令c=1(此处frac若是全为1,则会导致frac+c超出围,这是bug,当还是通过了);
b)当x[i-1]=1且x[i-2]、x[i-3]…x[0]不都为0,令c=1(与a存在同样的bug);
c)除a、b的情况,c=0;
C.其他特殊情况再考虑一下就好了;
13.intfloat_f2i(unsigneduf);
exp为0,x=(-1)^s*0.frac*2^(-126);否则x=(-1)^s*1.frac*2^(exp-127)分情况考虑:
A.根据float转为int是向0舍入的情况,当exp=0或者exp<127(由exp-127<0得到);
B.令exp_sign=((exp>>23)-127)>=0,根据x=(-1)^s*1.frac*(exp-127),
a)exp_sign=0,x=1.x[22]x[21]…x[0]-->x=1;
b)exp_sign=1,x=1x[22].x[21]…x[0]-->x=1x[22];
c)exp_sign=2,x=1x[22]x[21].x[20]…x[0]-->x=1x[22]x[21];
d)exp_sign=23,x=1x[22]x[21]x[20]…x[0]-->x=1x[22]x[21]…x[0]
e)exp_sign=30,x=1x[22]x[21]x[20]…x[0]-->x=1x[22]x[21]…x[0]0…0(共31位)
f)exp_sign=32,x=1x[22]x[21]x[20]…x[0]-->x=1x[22]x[21]…x[0]0…0(共32位),此时,因为int为有符号,只有0x000000000能被表示出来,其他都是NAN;
C.当exp_sign=((exp>>23)-127)>=33,NAN
最终截图:
五、实验总结与体会
此次实验主要考查的是对数据的处理,对此需要掌握数据在机器中的表示,运用合理的位运算来实现相应的功能。
通过此次实验,我更好地熟悉和掌握计算机中整数和浮点数的二进制编码表示。
尤其是加深对数据二进制编码表示的了解。
通过使用有限类型和数量的运算操作实现一组给定功能的函数来提高了我对数据表示方面的C语言编程能力。
指导教师批阅意见:
成绩评定:
指导教师签字:
罗秋明
2017年4月10日
备注: