计算机基础大作业完整版.docx
《计算机基础大作业完整版.docx》由会员分享,可在线阅读,更多相关《计算机基础大作业完整版.docx(24页珍藏版)》请在冰豆网上搜索。
计算机基础大作业完整版
学生实验报告
(理工类)
课程名称:
计算机系统基础I专业班级:
学生学号:
学生姓名:
所属院部:
计算机工程学院指导老师:
——第1学期
金陵科技学院教务处制
试验汇报书写要求
试验汇报标准上要求学生手写,要求书写工整。
若因课程特点需打印,要遵照以下字体、字号、间距等具体要求。
纸张一律采取A4纸张。
试验汇报书写说明
试验汇报中一至四项内容为必填项,包含试验目和要求;试验仪器和设备;试验内容与过程;试验结果与分析。
各院部可依据学科特点和试验具体要求增加项目。
填写注意事项
(1)细致观察,立刻、正确、如实统计。
(2)正确说明,层次清楚。
(3)尽可能采取专用术语来说明事物。
(4)外文、符号、公式要正确,应使用统一要求名词和符号。
(5)应独立完成试验汇报书写,严禁剽窃、复印,一经发觉,以零分论处。
试验汇报批改说明
试验汇报批改要立刻、认真、仔细,一律用红色笔批改。
试验汇报批改成绩采取百分制,具体评分标准由各院部自行制订。
试验汇报装订要求
试验批改完成后,任课老师将每门课程每个试验项目试验汇报以自然班为单位、按学号升序排列,装订成册,并附上一份该门课程试验纲领。
试验项目名称:
数据表示试验课时:
2
同组学生姓名:
无试验地点:
试验日期:
试验成绩:
批改老师:
批改时间:
一、试验目和要求
熟悉数值数据在计算机内部表示方法,掌握相关处理语句。
二、试验仪器和设备
硬件环境:
IA-32
软件环境:
Linuxubuntu14.04,C语言,gcc
三、试验内容与过程
1、试验内容
1.“-2<2”和“-2<2u”结果一样吗?
为何?
请编写程序验证。
2.运行下图中程序代码,并对程序输出结果进行分析。
3.运行下列代码,并对输出结果进行分析。
#include
voidmain()
{
unionNUM
{
inta;
charb[4];
}num;
num.a=0x12345678;
printf("0x%X\n",num.b[2]);
}
4.请说明下列赋值语句实施后,各个变量对应机器数和真值各是多少?
编写一段程序代码并进行编译,观察默认情况下,编译器是否报warning。
假如有warning信息话,分析为何会出现这种warning信息。
inta=;
intb=-;
intc=;
unsignedshortd=65539;
shorte=-32790;
5.编译运行以下程序,并最少反复运行3次。
voidmain()
{
doublex=23.001,y=24.001,z=1.0;
for(inti=0;i<10;i++){
if((y-x)==z)
printf("equal.n");
else
printf("notequal\n");
x+=z;
y+=z;
printf("%d,%f,%f\n”,i,x,y);
}
}
要求:
(1)给出每次运行结果截图。
(2)每次运行过程中,是否每一次循环中判等结果都一致?
为何?
(3)每次运行过程中,每一次循环输出i、x和y结果分别是什么?
为何?
2、试验步骤
1.进入linux系统,在shell终端提醒符后输入gedit,编写C语言源程序。
gedit
输入试验内容1源程序并以SAMPLE.C为文件名将文件存盘。
2.用GCC对源文件SAMPLE.C进行编译并产生目标文件SAMPLE.O,汇编语言程序SAMPLE.S。
gcc–s–oSAMPLE.SSAMPLE.C
gcc–g–oSAMPLE.OSAMPLE.C
3.用GDB跟踪实施SAMPLE。
gdbSAMPLE
4.观察程序实施情况并统计运行结果。
5.依据上述四个步骤,完成对其它试验内容操作。
四、试验结果与分析
(1)
#include
voidmain()
{
inta,c;
a=(-2<2)?
1:
0;
c=(-2<2u)?
1:
0;
printf("%d\n%d\n",a,c);
}
正数原码,反码,补码都一样。
而负数在计算机里是按补码存放和运算。
-2在内存中存放方法为1111,1111,1111,1111,11111,11111,1111,1110B即fffffffeH,最高位为符号位,2在内存中存放方法为0000,0000,0000,0000,0000,0000,0000,0010B
即2H,最高位为符号位,2u在内存中存放方法为0000,0000,0000,0000,0000,0000,0000,0010B即2H,最高位不再是符号位。
所以-2<2是符号位比较,即-2<2是正确。
-2<2u是有符号数和无符号数之间比较,此时编译器会把有符号数自动转无符号数,所以-2=2。
-2<2,是有符号数比较,即2+(-2)=fffffffeH+fffffffeH=1FFFFFFFCH=[-4]补,最高位符号位溢出,所以证实被减数符号是负号,即-2<2是正确。
.
有符号数和无符号数比较。
系统会自动把有符号数转换成无符号数。
fffffffeH=D<2D(是错误)=2H
(2)
因为全部比int型小数据类型(包含char,signedchar,unsignedchar,short,signedshort,unsignedshort)转换为int型。
假如转换后数据会超出int型所能表示范围话,则转换为unsignedint型;所以题中c在和a比较时应该先转换成int型,再转换成unsignedint型,所以此时c为11111111111111111111111111111111B(有符号数按最高位符号位进行扩位)即FFFFFFFFH,此时a为1H,显然c大于a,所以第一次输出是unsignedintis0;同理当b和c比较时,c应该转换成int型,所以此时c为11111111111111111111111111111111B即FFFFH=-D,b也应该转换成int型,所以此时b为00000000000000000000000000000001B=1D,显然b>c,所以输出unsignedshortis1
#include
Voidmain()
{
Unsignedinta=1;
Unsignedshortb=1;
Charc=-1;
Intd;
d=(a>c)?
1:
0;
printf(“unsignedintis%d\n”,d);
d=(b>c)?
1:
0;
printf(“unsignedintis%d\n”,d);
}
(3)
因为在union共用体当中,inta和charb[4]数据公用同一段内存地址,而此时a和b同时占用四个字节,所以当实施num.a=0x12345678;同时b也会被赋值,b内存示意图以下:
b值
8
7
6
5
4
3
2
1
b地址
b[0]
b[1]
b[2]
b[3]
由上图可知实施printf("0x%X\n",num.b[2]);会输出0x34。
现在解释为何会出现表中情况对于数组来说,下标越小地址越小,下标越大地址越大,而a=0x12345678这个值中,1和2分别在最高位和次高位,它就会存放在下标大b[3]中,以这类推,便能够得到表中数据。
这也证实了我32位Ubuntu是小端存放(字数据高字节存放在高地址中,而字数据低字节则存放在低地址中)。
(4)
#include
voidmain()
{
inta=;4个字节
intb=-;
intc=-;
unsignedshortd=65539;2个字节
shorte=-32790;2个字节
printf("%d\n",a);
printf("%d\n",b);
printf("%d\n",c);
printf("%d\n",d);
printf("%d\n",e);
}
机器数就是数字在计算机中二进制表示形式,其特点一是符号数字化,二是
其数大小受机器字长限制。
将带符号位机器数对应真正数值称为机器数真值
inta=机器数是10000000000000000000000000000000B
intb=-机器数是10000000000000000000000000000000B
intc=机器数是10000000000000000000000000000001B
unsignedshortd=65539机器数无法表示
shorte=-32790机器数无法表示
int类型在32位计算机中占4个字节,即32位。
又因为正数补码是其本身,所以int类型能表示全部正数为:
0,0000000000000000000000000000000B到0,1111111111111111111111111111111B即0到+。
而负数补码是除符号位外各位取反最终加一而来。
所以int类型所能表示全部负数为:
0,0000000000000000000000000000000B(-0D补码)到1,1111111111111111111111111111111B即0到-D。
而32位二进制数能表示全部值为232次方个,而从-D到+D总共是232次方减一个数,而少这个数就是10000000000000000000000000000000B(-0D补码),而任何数原码都不能在转换成补码时成为这个数,我们人为把她要求为-所以int类型取值范围为-到+,所以题目中b是正确,而且不会发生溢出。
而题目中a=其实已经超出int类型最大范围,但是
a==+1=0,1111111111111111111111111111111B+1B=10000000000000000000000000000000B=-,而-又在int类型取值范围内,所以也不会溢出,假如此时打印输出a十进制就是-,同理可得c==+2=-,也不会发生溢出现象。
对于题目中d,因为它是无符号短整型变量,在32位机中占两个字节。
所以d取值范围为:
0到65535,而65539不在这个范围内,所以会报溢出警告。
对于题目中e,因为它是有符号短整型变量,在32位机中占两个字节。
所以e取值
范围为:
-32768到+32767,此时c=-32790=-32768-22=-32768+(-22)=
10000000000000000000000000000000B+11111111111111111111111111101001B=000101111111111111111111111111101001B=+D>>+32767D所以e会报出溢出警告。
5.
Double双精度浮点数,根据IEEE-754标准,双精度浮点数有效数字到小数点后15位,x=23.001,可表示为23.01;y=24.001;
31.001会表示成31.001,32.001会表示成32.005,于是就不相等了。
结尾那个1或5都是因为有限精度无法正确小数造成,
(1)
(2)
每次运行过程中,每一次循环输出i、x和y结果分别是
i=0,x=24.001,y=25.001;
i=1,x=25.001,y=26.001
i=2,x=26.001,y=27.001
i=3,x=27.001,y=28.001
i=4,x=28.001,y=29.001
i=5,x=29.001,y=30.001
i=6,x=30.001,y=31.001
i=7,x=31.001,y=32.001
i=8,x=32.001,y=33.001
i=9,x=33.001,y=34.001
五、试验思索题和试验心得。
1、思索题
1.完成书上第二章习题中第40题,提交代码,并在程序中以十六进制形式打印变量u机器数。
floatfpower2(intx)
{
unsignedexp,frac,u;
if(x<-149)
{
exp=0;
frac=0;
}
elseif(x<-126)
{
exp=0;
frac=0x400000>>(-x-127);
}
elseif(x<128)
{
exp=x+127;
frac=0;
}
else{
exp=255;
frac=0;
}
u=exp<<23||frac;
returnu2f(u);
}
2、试验心得
了解了linux基础操作。
了解了编译实施,反编译过程和操作步骤。
了解了当计算机面对C语言时,计算机是怎样表示和编译。
我们能够查看编译过程来了解计算机思想。
还需继续努力。
试验项目名称:
排序程序编辑、编译和调试试验课时:
2
同组学生姓名:
无试验地点:
试验日期:
试验成绩:
批改老师:
批改时间:
一、试验目和要求
熟悉开发环境、掌握开发和调试基础过程以及工具。
二、试验仪器和设备
硬件环境:
IA-32
软件环境:
Linuxubuntu14.04,C语言,gcc
三、试验过程
1、试验内容
以下程序实现了排序和求和算法,程序源码以下图所表示。
请依据提供图片输入源程序文件,并保留为对应.c和.h文件,然后进行编译、链接,调试。
bubblesort.h:
bubblesort.c:
add.h:
add.c:
printresult.h:
printresult.c:
main.c:
冒泡排序求和打印结果退出
请选择序号
原始数组为
数组求和结果为
排序后数组为
请选择正确序号!
请继续!
2、试验步骤
1.进入linux系统,在shell终端提醒符后输入gedit,编写C语言源程序。
2.将源程序文件进行预处理、编译、汇编和链接,以生成可实施文件。
(1)使用gcc直接生成可实施文件
gcc-omainmain.cbubblesort.cadd.cprintresult.c
(2)首先生成可重定位目标文件(.o文件),再链接成可实施文件。
首先,使用gcc–c……命令将全部.c文件编译成.o文件(能够用-o选项命名输出可重定位目标文件),然后再用ld命令进行链接,以生成可实施目标文件。
(用ld命令链接时要包含很多系统库,能够用gcc–vmain.c来查看系统链接需要哪些库,把collect2换成ld,生成/tmp/ccBCU0rh.o即为mian.c编译出来main.o文件,删掉该句替换成以下命令:
-omainmain.obubblesort.oadd.oprintresult.o-emain)
ld-omainmain.obubblesort.oadd.oprintresult.o-emain--sysroot=/--build-id--eh-frame-hdr-melf_i386--hash-style=gnu--as-needed-dynamic-linker/lib/ld-linux.so.2–zrelro/usr/lib/gcc/i686-linux-gnu/4.8/../../../i386-linux-gnu/crt1.o/usr/lib/gcc/i686-linux-gnu/4.8/../../../i386-linux-gnu/crti.o/usr/lib/gcc/i686-linux-gnu/4.8/crtbegin.o-L/usr/lib/gcc/i686-linux-gnu/4.8-L/usr/lib/gcc/i686-linux-gnu/4.8/../../../i386-linux-gnu-L/usr/lib/gcc/i686-linux-gnu/4.8/../../../../lib-L/lib/i386-linux-gnu-L/lib/../lib-L/usr/lib/i386-linux-gnu-L/usr/lib/../lib-L/usr/lib/gcc/i686-linux-gnu/4.8/../../..–lgcc--as-needed-lgcc_s--no-as-needed-lc-lgcc--as-needed-lgcc_s--no-as-needed/usr/lib/gcc/i686-linux-gnu/4.8/crtend.o/usr/lib/gcc/i686-linux-gnu/4.8/../../../i386-linux-gnu/crtn.o
上述过程以下图所表示:
3.使用OBJDUMP命令进行反汇编(请自行查阅OBJDUMP命令使用方法)
比如,可使用“objdump–S”命令进行反汇编
objdump–Smain.o:
将main.o进行反汇编
4.使用GDB命令进行多种调试(GDB命令参见教材附录C,也可自行查阅网上相关文档)
调试之前首先用“gcc–g”命令生成调试信息,不然调试失败。
gcc-g-omainmain.cbubblesort.cadd.cprintresult.c
gdbmain
要求用多种GDB命令对程序进行调试(比如用inforegisters查看寄存器内容)。
四、试验结果与分析
1.编写对应.c和.h文件
2.使用gcc直接生成可实施文件
3.运行main结果
4.使用OBJDUMP命令进行反汇编
5.使用GDB命令进行多种调试.调试之前首先用“gcc–g”命令生成调试信息
gcc-g-omainmain.cbubblesort.cadd.cprintresult.c
gdbmain
(gdb)help:
查看命令帮助,具体命令查询在gdb中输入help+命令.
(gdb)list:
查看原代码(list-n,从第n行开始查看代码。
list+函数名:
查看具体函数)
(gdb)step:
单步调试(逐语句:
跳入自定义函数内部实施)
(gdb)run:
重新开始运行文件
(gdb)break3设置断点
(gdb)infob查看断点处情况
(gdb)inforegisters查看寄存器内容
(gdb)continue:
继续运行
五、试验思索题和试验心得
1、试验思索题
1.分析同一个源程序在不一样机器上生成可实施目标代码是否相同。
提醒:
从多个方面(如ISA、OS和编译器)来分析。
2.你能在可实施目标文件中找出函数printf()对应机器代码段吗?
能话,请标示出来。
(1)答:
不相同,因为一:
总线条数有区分,有16位,32位,64位总线结构,造成并
行一次传输数据不会一致,二:
操作系统不一样,有Linux系统,Windows系统,mcos系统之分,造成程序才汇编和链接时ELF表不会完全相同,三:
从编译器来说,有gcc,vsC++之分,而不一样编译器在数据对齐方面,库函数源文件方面,符号表创建和解析方面不会完全相同。
所以造成在不一样机器上生成可实施代码不相同。
(2) 答:
不能,因为printf()在动态库libc.so.中,而这个库是动态链接库,所以程序在链接时并不把这个库函数机器码链接可实施程序中,而是在实施程序时候才加载进来。
所以不能找到printf()函数。
2、试验心得
此次试验了解到程序首先生成可重定位目标文件(.o文件),再链接成可实施文件。
以及gdb相关操作。
另外,GDB出现减轻了开发人员负担,她们能够在程序运行时候单步跟踪自己代码,或者经过断点临时中止程序实施。
我们也能够随时察看变量和内存目前状态,并监视关键数据结构是怎样影响代码运行。