实验03整数的表示实验.docx
- 文档编号:12084641
- 上传时间:2023-06-04
- 格式:DOCX
- 页数:17
- 大小:638.83KB
实验03整数的表示实验.docx
《实验03整数的表示实验.docx》由会员分享,可在线阅读,更多相关《实验03整数的表示实验.docx(17页珍藏版)》请在冰点文库上搜索。
实验03整数的表示实验
浙江大学城市学院实验报告
课程名称计算机系统原理实验
实验项目名称实验三数据的机器级表示
实验成绩指导老师(签名)日期
一、实验目的:
1、通过无符号数和带符号整数之间的相互转换来理解无符号数和补码整数的表示;
2、了解IEEE754浮点数在机器中的应用,特别是一些特殊值的处理。
二、实验步骤:
1、用32位补码表示的机器上编译并执行以下程序,记录程序的执行结果,并解释原因。
图3-1
运行结果:
对运算结果的解释:
第一个结果:
因为在ISOC90标准中,编译器将-2147483648分为两个部分来处理。
首先将2147483648看成无符号整型,其机器数为0x80000000,然会对其取负,结果仍为0x80000000,还是将其看成无符号整型,其值仍为21474833648,因此前者大于后者。
第二个结果:
由于i为int型变量,因此这两个数皆为带符号数,前者小于后者。
第三个结果:
编译器首先将2147483647看成带符号整型,然后对其取负,得到-2147483647,然后对其-1得到-2147483648,因此前者大于后者。
2、编写程序,计算表2.1中的表达式,说明运算类型(无符号、带符号),得到运算结果,并说明为什么是这样的运算结果(参考第二章习题8);
源代码:
运算结果:
对运算结果的解释:
1.0和0U都是无符号数,值相等
2.-1和0都为带符号数,因此前者小于后者
3.0后加上U表示无符号数,因此比较时前者大于后者
4.-2147483647-1的计算结果为一个int型整数,为带符号数,因此前者大于后者。
5.加上U的数都为无符号数,因此前者小于后者
6.2147483648U在经过int强制类型转换后,变为带符号的-2147483648,因此前者大于后者
7.两个数皆为带符号数,因此前者大于后者
8.数据转化为无符号数,前者11…1B(2^32-1)>后者11…10B(2^32-2)
3、分析以下代码:
intsum(inta[],unsignedlen){
inti,sum=0;
for(i=0;i<=len-1;i++)
sum+=a[i];
returnsum;
}
当len=0时,执行sum函数的for循环时会发生AccessViolation,即段错误异常.但是,当参数len说明为int型时,sum函数能正确执行,为什么?
编写程序测试并分析。
原因分析:
因为当len的类型为unsigned时,len-1发生了下溢出,因此出现段错误。
而int的表示范围包括了-1,因此正常运行。
测试程序:
Unsigned:
Int:
4、在32位计算机中运行一个C语言程序,在该程序中出现了以下变量的初值,请手工算出它们对应的机器数(用十六进制表示)(第二章习题9),写出详细的计算过程,然后用程序验证在内存中这些变量的机器数,并截图显示。
(1)intx=-32768
(2)shorty=522
(3)unsignedz=65530
(4)charc=’@’
(5)floata=-1.1
(6)doubleb=10.5
手工计算过程:
1.Intx=-32768二进制原码(32位)10000000000000001000000000000000
补码:
除符号位外,每位取反,末位加一11111111111111110111111111111111+1=
11111111111111111000000000000000转化为十六进制数:
ffff8000
2.shorty=522二进制原码(16位)0000001000001010补码:
0000001000001010十六进制:
020a
3.unsignedz=65530二进制原码(32位)00000000000000001111111111111010
补码:
00000000000000001111111111111010十六进制:
0000fffa
4.charc=‘@’@的ASCII码为64二进制原码(8位):
01000000补码:
01000000
十六进制数:
40
5.floata=-1.1二进制原码(32位)符号位:
1(负)阶数0->二进制00000000->偏移01111111->阶码:
01111111尾数:
00011001100110011001101
得到二进制机器数:
10111111100011001100110011001100
十六进制:
bf8cccch(与程序验证有出入)
6.Doubleb=10.5二进制1010.1规格化后:
1.0101*2^11符号位:
0阶数:
11阶码:
000000000000011+011111111111111=100000000000010尾0101000……000(52位)结果即:
010*********……000(52位)
十六进制即4025000000000000(与程序验证有出入)
编程验证源码:
查看内存结果截图:
5、(选做)设计一个C语言程序,输出一个整数对应的有符号值和无符号值。
源码:
#include
#include
intsumn(chara[200]){
intb[200];
intlen=0;
for(inti=0;a[i]!
='\0';i++){
if(a[i]>='0'&&a[i]<='9'){
b[i]=a[i]-'0';
}
elseif(a[i]>='A'&&a[i]<='F'){
b[i]=a[i]-'A'+10;
}
len++;
}
intsum=0;
intk=0;
for(intj=len-1;j>=0;j--){
sum=sum+b[j]*pow(16,k);
k++;
}
returnsum;
}
intmain(void){
charnum[20];
inta[20];
intremain[10000];
printf("请输入要显示的数据格式为:
程序参数,如./display0x27\n");
while
(1){
gets(num);
intflag=0;
intpos=0;
if(num[0]=='0'&&num[1]=='x'){
flag=1;
if(num[2]=='-'){
pos=1;
for(inti=0;num[i]!
='\0';i++){
num[i]=num[i+3];
}
}
else{
for(inti=0;num[i]!
='\0';i++){
num[i]=num[i+2];
}
}
}
if(num[0]=='-'){
pos=1;
for(inti=0;num[i]!
='\0';i++){
num[i]=num[i+1];
}
}
intsum=0;
if(flag==0){
for(inti=0;num[i]!
='\0';i++){
a[i]=num[i]-'0';
sum=sum*10+a[i];
}
}
into=0;
intlen=0;
if(flag==1){
for(inti=0;num[i]!
='\0';i++){
len++;
}
sum=sumn(num);
}
intk=0;
charq[11];
q[0]='0';
q[1]='x';
for(inti=2;i<10;i++){
q[i]='0';
}
charhex[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
if(pos==1){
sum=128+sum;
}
intt=sum;
intj=9;
while(t>0){
q[j]=hex[t%16];
t=t/16;
j--;
}
if(pos==0){
printf("Hex:
");
for(inti=0;i<10;i++){
printf("%c",q[i]);
}
printf("Signed:
%dUnsigned:
%d\n",sum,sum);
}
else{
printf("Hex:
");
for(inti=0;i<9;i++){
printf("%c",q[i]);
}
printf("Signed:
%dUnsigned:
%d\n",-sum,sum+128);
}
}
}
运行结果:
6、编写程序得出float和double类型的精度(计算机专业必做,软件工程专业选做);
源代码:
运算结果:
根据初始值和输出值的比较得出,float的精度约为7位,double的精度约为16位
7、(选做)设计一个C语言程序,输出一个浮点数的IEEE754标准的二进制表示。
源代码:
#include
intmain(void){
while
(1){
floatn;
printf("请输入要输出的数字(输出结果以二进制表示)\n");
scanf("%f",&n);
intflag=0;
if(n<0){
flag=1;
n=-n;
}
printf("Floatingpointvalue:
%.9f\n",n);
inta=(int)n;
inttwo[100];
floatb;
b=n-a;
inti=0;
intlen=0;
while(a){
two[i]=a%2;
a=a/2;
i++;
len++;
}
intpoint=len;
into[100];
for(inti=0;i o[i]=two[len-i-1]; } for(i=len;i<24;i++){ o[i]=(int)(b*2); b=2*b-(int)(b*2); } intex[8]={0}; point=point-1+127; intk=7; while(point){ ex[k]=point%2; point=point/2; k--; } printf("BitRepresentation="); printf("%d",flag); for(intj=0;j<8;j++){ printf("%d",ex[j]); } for(intj=1;j<24;j++){ printf("%d",o[j]); } printf("sign=%dexponent=",flag); for(intj=0;j<8;j++){ printf("%d",ex[j]); } printf("fraction="); for(intj=1;j<24;j++){ printf("%d",o[j]); } printf("\n"); printf("\n"); } } 运算结果: 解释: 先判断正负来确定符号位,然后将浮点数分为整数部分和小数部分,分别按相应规则转化为二进制数,根据IEEE754规则,浮点数在计算机中储存形式位1位符号位,加8位阶码,以及23位尾数组成,根据此规则输出即可。 四、思考题(必做) 1、你的机器字长多少位? int类型的位数、最小值和最大值各是多少? 32位32位-214783648214783647 2、在你的机器上,-1用int类型和unsigedint类型表示的结果分别是多少? 3、float类型和double类型的精度各是多少? Float7-8位double15位 4、gcc默认的C语言标准是哪一个? GNUC90
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 03 整数 表示