实验报告二 数据的表示1

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

计算机系统基础实验报告

学院信电学院专业计算机科学与技术班级计算机1401 学号140210110 姓名段登赢实验时间:

一、实验名称:数据的表示1

二、实验目的和要求:

(1)实验目的:熟悉数值数据在计算机内部的表示方式,掌握相关的处理语句。

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

三、实验环境(软、硬件):

软件环境:

操作系统:Ubuntu ,版本:15.04

编译器软件:GCC,版本:5.4.0

硬件环境:

处理器:i386处理器

处理器个数:双处理器

总核心数:四核

处理器位数:32位

四、实验内容:

(1)下述两个结构所占存储空间多大?结构中各分量所在位置相对于结构起始位置的偏移量是多少?请编写程序以验证你的答案。

struct test1

{

char x2[3];

short x3[2];

int x1;

long long x4;

};

struct test2

{

char x2[3];

short x3[2];

int x1;

long long x4;

}__attribute__((aligned(8)));

(2)“-2 < 2”和“-2 < 2u”的结果一样吗?为什么?

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

(4)运行下列代码,并对输出结果进行分析。

#include

void main()

{

union NUM

{

int a;

char b[4];

} num;

num.a = 0x12345678;

printf("0x%X\n", num.b[2]);

}

五、实验结果及分析:

(1)

补]4[ (2)

实验分析:

正数的源码,反码,补码都相同,负数在计算机存储时按补码存储和运算,源码除符号位外将每一位按位取反最后加一而来。在32位计算机中int 占4个字节共32位。所以-2在内存中的存储方式:1,111 1111 1111 1111 1111 1111 1111 1110B 即fffffffeH ,此时最高位为符号位,2在内存中的存储方式:0,000 0000 0000 0000 0000 0000 0000 0010B 即2H ,此时最高位为符号位。2u 在内存中的存储方式:0000 0000 0000 0000 0000 0000 0000 0010B 即2H ,但此时最高位不再是符号位。由上述可知:-2<2是有符号数的比较,即-2+(-2)=fffffffeH+fffffffeH=1FFFFFFFCH= ,最高位符号位溢出,所以证明被减数的符号是负号,即-2<2是正确的。-2<2u 是有符号数和无符号数之间的比较,此时编译器会把有符号数自动转换成无符号数,所以就是:fffffffeH=4294967294D<2D=2H ,显然这是错误的。

(3)

实验分析:

因为所有比int 型小的数据类型(包括char,signed char,unsigned char,short,signed short,unsigned short )转换为int 型。如果转换后的数据会超出int 型所能表示的范围的话,则转换为unsigned int 型;所以题中的c 在和a 比较时应该先转换成int 型,再转换成unsigned int 型,所以此时的c 为1111 1111 1111 1111 1111 1111 1111 1111B (有符号数按最高位符号位进行扩位)即FFFFFFFFH ,此时的a 为1H ,显然c 大于a ,所以第一次输出的是unsigned int is 0;同理当b 和c 比较时,c 应该转换成int 型,所以此时的c 为1111 1111 1111 1111 1111 1111 1111 1111B 即FFFFH=-2147483647D ,b 也应该转换成int 型,所以此时的b 为0000 0000 0000 0000 0000 0000 0000 0001B=1D ,显然b>c ,所以输出unsigned short is 1

(4)

实验分析:

由于在union 共用体当中,int a 和char b[4]数据公用同一段内存地址,而此时a 和b 同

时占用四个字节,所以当执行num.a = 0x12345678;同时b也会被赋值,b的内存示意图如下:

由上图可知执行printf("0x%X\n", num.b[2]);会输出0x34。现在解释为什么会出现表中的情况对于数组来说,下标越小地址越小,下标越大地址越大,而a=0x12345678这个值中,1和2分别在最高位和次高位,它就会存储在下标大的b[3]中,以此类推,便可以得到表中的数据。这也证明了我的32位Ubuntu是小端存储(字数据的高字节存储在高地址中,而字数据的低字节则存储在低地址中)。

六、实验心得

通过这次实验让我对结构体和公共体有了更为深入的理解,首先我明白了结构体中成员的对齐理论,知道了在结构体中数据成员初始化顺序的不同也会影响到该结构体所占的内存空间的大小。其次我也学到了公共体的成员的内存地址是相同的,并且自己通过实验也亲自验证了这一结论。并且再一次巩固了C语言中数据类型之间的自动转换,无符号数与有符号数之间的转换规则。

相关文档
最新文档