计算机基础大作业完整版Word格式.docx

上传人:b****6 文档编号:17084762 上传时间:2022-11-28 格式:DOCX 页数:24 大小:1.98MB
下载 相关 举报
计算机基础大作业完整版Word格式.docx_第1页
第1页 / 共24页
计算机基础大作业完整版Word格式.docx_第2页
第2页 / 共24页
计算机基础大作业完整版Word格式.docx_第3页
第3页 / 共24页
计算机基础大作业完整版Word格式.docx_第4页
第4页 / 共24页
计算机基础大作业完整版Word格式.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

计算机基础大作业完整版Word格式.docx

《计算机基础大作业完整版Word格式.docx》由会员分享,可在线阅读,更多相关《计算机基础大作业完整版Word格式.docx(24页珍藏版)》请在冰豆网上搜索。

计算机基础大作业完整版Word格式.docx

实验报告装订要求

实验批改完毕后,任课老师将每门课程的每个实验项目的实验报告以自然班为单位、按学号升序排列,装订成册,并附上一份该门课程的实验大纲。

实验项目名称:

数据的表示实验学时:

2

同组学生姓名:

无实验地点:

实验日期:

实验成绩:

批改教师:

批改时间:

一、实验目的和要求

熟悉数值数据在计算机内部的表示方式,掌握相关的处理语句。

二、实验仪器和设备

硬件环境:

IA-32

软件环境:

Linuxubuntu14.04,C语言,gcc

三、实验内容与过程

1、实验内容

1.“-2<

2”和“-2<

2u”的结果一样吗?

为什么?

请编写程序验证。

2.运行下图中的程序代码,并对程序输出结果进行分析。

3.运行下列代码,并对输出结果进行分析。

#include<

stdio.h>

voidmain()

{

unionNUM

{

inta;

charb[4];

}num;

num.a=0x12345678;

printf("

0x%X\n"

num.b[2]);

}

4.请说明下列赋值语句执行后,各个变量对应的机器数和真值各是多少?

编写一段程序代码并进行编译,观察默认情况下,编译器是否报warning。

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

inta=2147483648;

intb=-2147483648;

intc=2147483649;

unsignedshortd=65539;

shorte=-32790;

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

{

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;

%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<

inta,c;

a=(-2<

2)?

1:

0;

c=(-2<

2u)?

%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)=fffffffeH+fffffffeH=1FFFFFFFCH=[-4]补,最高位符号位溢出,所以证明被减数的符号是负号,即-2<

.

有符号数和无符号数的比较。

系统会自动把有符号数转换成无符号数。

fffffffeH=4294967294D<

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=-2147483647D,b也应该转换成int型,所以此时的b为00000000000000000000000000000001B=1D,显然b>

c,所以输出unsignedshortis1

Voidmain()

Unsignedinta=1;

Unsignedshortb=1;

Charc=-1;

Intd;

d=(a>

c)?

printf(“unsignedintis%d\n”,d);

d=(b>

(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("

会输出0x34。

现在解释为什么会出现表中的情况对于数组来说,下标越小地址越小,下标越大地址越大,而a=0x12345678这个值中,1和2分别在最高位和次高位,它就会存储在下标大的b[3]中,以此类推,便可以得到表中的数据。

这也证明了我的32位Ubuntu是小端存储(字数据的高字节存储在高地址中,而字数据的低字节则存储在低地址中)。

(4)

inta=2147483648;

4个字节

intb=-2147483648;

intc=-2147483649;

unsignedshortd=65539;

2个字节

shorte=-32790;

printf("

%d\n"

a);

b);

c);

d);

e);

机器数就是数字在计算机中的二进制表示形式,其特点一是符号数字化,二是

其数的大小受机器字长的限制。

将带符号位的机器数对应的真正数值称为机器数的真值

inta=2147483648的机器数是10000000000000000000000000000000B

intb=-2147483648的机器数是10000000000000000000000000000000B

intc=2147483649的机器数是10000000000000000000000000000001B

unsignedshortd=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,也不会发生溢出现象。

对于题目中的d,由于它是无符号短整型的变量,在32位机中占两个字节。

所以d的取值范围为:

0到65535,而65539不在这个范围内,所以会报溢出警告。

对于题目中的e,由于它是有符号短整型的变量,在32位机中占两个字节。

所以e的取值

范围为:

-32768到+32767,此时c=-32790=-32768-22=-32768+(-22)=

10000000000000000000000000000000B+11111111111111111111111111101001B=000101111111111111111111111111101001B=+6442450921D>

>

+32767D所以e会报出溢出警告。

5.

Double双精度浮点数,按照IEEE-754标准,双精度浮点数有效数字到小数点后15位,x=23.001,可表示为23.00100000000001;

y=24.001000000000001;

31.001会表示成31.001000000000001,32.001会表示成32.001000000000005,于是就不相等了。

结尾的那个1或5都是由于有限精度无法精确的小数造成的,

每次运行过程中,每一次循环输出的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);

128)

exp=x+127;

frac=0;

else{

exp=255;

u=exp<

<

23||frac;

returnu2f(u);

2、实验心得

了解了linux的基本操作。

理解了编译执行,反编译的过程和操作步骤。

理解了当计算机面对C语言时,计算机是如何表示和编译的。

我们可以查看编译过程来了解计算机的思想。

还需继续努力。

排序程序的编辑、编译和调试实验学时:

熟悉开发环境、掌握开发和调试的基本过程以及工具。

三、实验过程

以下程序实现了排序和求和算法,程序源码如下图所示。

请根据提供的图片输入源程序文件,并保存为相应的.c和.h文件,然后进行编译、链接,调试。

bubblesort.h:

bubblesort.c:

add.h:

add.c:

printresult.h:

printresult.c:

main.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”命令生成调试信息

(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()函数。

此次试验了解到程序首先生成可重定位目标文件(.o文件),再链接成可执行文件。

以及gdb的相关操作。

此外,GDB的出现减轻了开发人员的负担,他们可以在程序运行的时候单步跟踪自己的代码,或者通过断点暂时中止程序的执行。

我们也能够随时察看变量和内存的当前状态,并监视关键的数据结构是如何影响代码运行。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 广告传媒

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1