重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
实验序号:2 实验名称:定点数加减法的机器级表示
适用专业:软件工程 学 时 数:2学时
1、掌握定点数加法的机器级表示。
2、掌握定点数减法的机器级表示。
3、掌握EFLAGS中4个牵涉到计算的标志位的计算方法。
4、掌握计算溢出的判定方法。
按照实验题目的要求,编写程序并上机调试
三、实验设备、环境计算机、Windows 7 、Visual C++ 6.0
四、实验步骤及内容用C语言编写二进制数运算模拟程序
1.编写整数加减法器:
设在main中有如下数组:
char int1[5];
char int2[5];
编写函数
int addsub(char int1[],char int2[],int flag,int m,int n);
当flag为0时表示加法运算,当flag为1时表示减法运算,做4位的加减法运算,返回4位结果。m和n分别是int1和int2的大小。在函数中必须要计算OF,CF,SF,ZF,并输出4个值,根据值输出是否产生了溢出,是哪一种溢出。
提示:
1.要注意到减法运算本质仍然是做加法,只不过要将减数取补码而已。
2.注意OF和CF并不只是判定最高位是否有进位
3.注意判定是否溢出必须要知道数是有符号还是无符号才行,加法器本身没有能力判定这一点。
1、为什么要用补码来表示整数?
2、机器底层是如何判定溢出的?
3、为什么编译器一定要知道数据的类型才能够做计算?
#includeint addsub(char int1[], char int2[], int flag, int m, int n);
int main()
{char input[10];
scanf("%s", input);
char int1[5];
char int2[5];
for (int i = 0; i< 4; i++)
{int1[i] = input[i] - '0';
int2[i] = input[i + 5] - '0';
}
int flag = input[4]=='-'?1:0;
addsub(int1, int2, flag, 4, 4);
printf("结果:%d%d%d%d\n", int2[0], int2[1], int2[2], int2[3]);
printf("ZF=%d,SF=%d,CF=%d,OF=%d",int1[0], int1[1], int1[2], int1[3]);
return 0;
}
int addsub(char int1[], char int2[], int flag, int m, int n)
{if(flag) {for(int i = 0; i< 4; i++ ) int2[i] = !int2[i];
for(int i = n - 1, carry = 1; ~i; i--) {int c = carry, b = int2[i];
int2[i] = int2[i] ^ carry;
carry = b & c;
if(carry == 0) break;
}
}
int carry[5] = {0}, res[4] = {0};
for(int i = n - 1; ~i; i-- ) {int a = int1[i], b = int2[i], c = carry[i + 1];
res[i] = a ^ b ^ c;
carry[i] = (a & c) | (b & c) | (a & b);
}
int OF = 0, ZF = 0, SF = 0, CF = 0;
CF = carry[0] ^ flag;
SF = res[0];
ZF = !(res[0] | res[1] | res[2] | res[3]);
OF = carry[0] ^ carry[1];
int1[0] = ZF, int1[1] = SF, int1[2] = CF, int1[3] = OF;
for(int i = 0; i< 4; i++ ) int2[i] = res[i];
return 0;
}
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧