- 81
- 0
- 约2.28千字
- 约 4页
- 2020-08-07 发布于河北
- 举报
计算机系统基础实验报告
学院 信电学院 专业 计算机科学与技术 ??班级 计算机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 stdio.h
void main()
{
union NUM
{
int a;
char b[4];
} num;
num.a = 0
printf(0x%X\n, num.b[2]);
}
实验结果及分析:
(1)
(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,但此时最高位不再是符号位。由上述可知:-22是有符号数的比较,即-2+(-2)=fffffffeH+fffffffeH=1FFFFFFFCH= ,最高位符号位溢出,所以证明被减数的符号是负号,即-22是正确的。-22u是有符号数和无符号数之间的比较,此时编译器会把有符号数自动转换成无符号数,所以就是:fffffffeH=4294967294D2D=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,显然bc,所以输出unsigned short is 1
(4)
实验分析:
由于在union共用体当中,int a 和char b[4]数据公用同一段内存地址,而此时a和b同时占用四个字节,所以当执行num.a = 0同时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=0个值中,1和2分别在最高位和次
原创力文档

文档评论(0)