计算机系统基础:实验2 定点数加减法运算的机器级表示
提示:根据《计算机系统基础》 中给出的解释来解决更容易,看一下p64页能更简单理解
题目要求:
1、 能够用C语言仿真加法器的运算过程
2、 能够用C语言仿真加法器的运算EFLAGS中4个牵涉到计算的标志位的计算方法,并且能够根据EFLAGS判定是否计算溢出。
#include <stdio.h>
#include <stdlib.h>
int addsub(char int1[],char int2[],int flag,int m,int n);
int intNum(char int1[]);
int main(int argc, char *argv[]) {
char int1[5];
char int2[5];
char s;
int flag = 0;
int i,j,n,m;
for(i=0;i<4;i++){
scanf("%c",&int1[i]);
}
scanf("%c",&s);
for(j=0;j<4;j++){
scanf("%c",&int2[j]);
}
if(s =='-'){
flag = 1;
}
m = intNum(int1);
n = intNum(int2);
// printf("int1=%d int2=%d\n",m,n);
// printf("运算符为=%d\n",flag);
addsub(int1,int2,flag,m,n);
return 0;
}
int addsub(char int1[],char int2[],int flag,int m,int n){
//ZF、OF、SF、CF
char s[4];
s[3] = '0';//默认是加法
if(flag){
s[3] = '1';
//减法运算转换成加法
int i;
int count = 0;
//求出减数的补码
for(i=3;i>=0;i--){
if(count){
int2[i] = int2[i]=='1' ? '0':'1';
}
if(int2[i]!='0'&& count == 0){
count++;
}
}
}
//加法运算
int j,count_0=0;
char carr='0',result[4];
for(j=3;j>=0;j--){
if(int1[j] == '1'&&int2[j] == '1'){
// printf("%c %c \n",int1[j],int2[j]);
if(carr=='1'){
result[j]='1';
}else{
result[j]='0';
}
carr='1';
}else if (int1[j] == '0'&&int2[j] == '0'){
// printf("%c %c \n",int1[j],int2[j]);
if(carr=='1'){
result[j]='1';
}else{
result[j]='0';
}
carr='0';
}else {
// printf("%c %c \n",int1[j],int2[j]);
if(carr=='1'){
result[j]='0';
}else{
result[j]='1';
}
}
if(result[j]=='0'){
count_0++;
}
// printf("%c",result[j]);
}
s[0] = count_0 == 4 ? '1':'0';//判断ZF
s[1] = int1[0] == int2[0] && result[0] != int1[0] ? '1':'0';//判断OF
s[2] = result[0];//判断SF
s[3] = s[3]==carr ? '0':'1';//判断CF
printf("结果:");
for (j=0; j<4; j++) {
printf("%c",result[j]);
}
// ZF=1,SF=0,CF=0,OF=0
printf("\nZF=%c,SF=%c,CF=%c,OF=%c\n",s[0],s[2],s[3],s[1]);
return 0;
}
//2进制转换到10进制
int intNum(char int1[]){
int i,sum = 0;
for(i=1;i<4;i++){
if(int1[i] != '0'){
sum = sum + (1<<(4-i-1));
}
}
if(int1[0] == '1'){
return -sum;
}
return sum;
}
本方法最后一个测试会出现一点问题,就是OF计算时,由于我使用的结果只有4位,如果使用5位的话,就可计算出OF为1,但是根据书本上的解释,我这样写的问题也不大。
测试举例:
总结:
秘诀:一定要看书,一定要看书!!
一点点C语言的水平,加上计算机系统基础中所说的一步一步来,可以轻松解决,我使用的三元运算符比较多,可以使用相应的ifelse来轻松解决,加油加油!