提示:根據(jù)《計算機(jī)系統(tǒng)基礎(chǔ)》 中給出的解釋來解決更容易,看一下p73頁能更簡單理解
題目要求:
#include#includefloat addfloat(char float1[], char float2[], int m, int n);
unsigned mul(char int1[], char int2[], int m, int n);
float floatToValue(char binary[],int count);//浮點(diǎn)數(shù)的10進(jìn)制轉(zhuǎn)換
int calExponent(char float1[], char float2[]);//對階
int shiftRight(char wei1_re[]);// 計算右規(guī)
void unsignedAdd(char wei1[],char wei2[],char wei_re[]);//計算無符號數(shù)相加
int main(){ // 浮點(diǎn)數(shù)加法器
// char float1[33];
// char float2[33];
// printf("浮點(diǎn)數(shù):\n");
// fgets(float1,33,stdin);
// scanf("\n");
// fgets(float2,33,stdin);
// int m = 0,n = 0;
// float result = addfloat(float1,float2,m,n);
// printf("結(jié)果為:%f \n",result);
//無符號整數(shù)乘法
char int1[5];
char int2[5];
printf("乘法:\n");
fgets(int1,5,stdin);
scanf("\n");
fgets(int2,5,stdin);
int m = 0,n = 0;
mul(int1, int2,m,n);
return 0;
}
float addfloat(char float1[], char float2[], int m, int n){char wei1[27],wei2[27],wei_re[27],result[32];;
int i;
for(i=0;i<27;i++){wei1[i] = '0';
wei2[i] = '0';
wei_re[i] = '0';
}
int move = calExponent(float1, float2);
//尾數(shù)加減
if(move<0){//move = -move;
int t;
//27位中第零位不取數(shù)字,用作進(jìn)位
//第二位為隱藏位,必為‘1’
wei1[-move+1] = '1';
wei2[1] = '1';
//之后的的23位為尾數(shù)的小數(shù)值
for(t=9;t<32;t++){wei1[t-7-move] = float1[t];
wei2[t-7] = float2[t];
}
unsignedAdd(wei1, wei2, wei_re);
//右規(guī)
int count = shiftRight(wei_re);
//計算最終值
for (i = 0; i<32; i++) {if(i<9){result[i] = float2[i];
}
else{result[i] = wei_re[i-7];//結(jié)果尾數(shù)的從第2位開始 第0位是右規(guī) 第1位是隱藏位
}
}
return floatToValue(result,count);
}
else{int t;
//27位中第零位不取數(shù)字,用作進(jìn)位
//第二位為隱藏位,必為‘1’
wei2[move+1] = '1';
wei1[1] = '1';
//之后的的23位為尾數(shù)的小數(shù)值
for(t=9;t<32;t++){wei2[t-7+move] = float2[t];
wei1[t-7] = float1[t];
}
unsignedAdd(wei2, wei1, wei_re);
//右規(guī)
int count = shiftRight(wei_re);
//計算最終值
for (i = 0; i<32; i++) {if(i<9){result[i] = float1[i];
}
else{result[i] = wei_re[i-7];//結(jié)果尾數(shù)的從第2位開始 第0位是右規(guī) 第1位是隱藏位
}
}
return floatToValue(result,count);
}
}
//計算階碼
int calExponent(char float1[], char float2[]){int count=0,i,j,e1=0,e2=0;
char temp[9];
temp[0] = '0';
//對階 float1的階碼-float2的階碼
for(i = 8; i >= 1; i--) {if(count){temp[i] = float2[i]=='1' ? '0':'1';
}
if(float2[i]!='0'&& count == 0){temp[i] = float2[i];
count++;
}
}
for(j=1;j<9;j++){if(float1[j]=='1') {e1 = e1 + (1<<(8-j));
}
if(temp[j]=='1') {e2 = e2 + (1<<(8-j));
}
}
return e1+e2-256;
}
//尾數(shù)右移
int shiftRight(char wei_re[]){//右規(guī)
int count = 0;
if (wei_re[0] == '1') {int i;
count++;
char temp[27];
for (i=0; i<27; i++) {temp[i] = wei_re[i];
}
wei_re[0] = '0';
for (i = 1; i<27; i++) {wei_re[i] = i==0 ? 0:temp[i-1];
}
}
if(wei_re[26]=='1'){if(wei_re[25]=='1'){int t;
for (t = 24; t>=0; t++) {if(wei_re[t]!='1'){wei_re[t] = '1';
break;
}
wei_re[t] = '0';
}
}
else {if(wei_re[24]=='1'){int v;
for (v = 23; v>=0; v++) {if(wei_re[v]!='1'){wei_re[v] = '1';
break;
}
wei_re[v] = '0';
}
}
}
}
return count;
}
//無符號整數(shù)乘法
unsigned mul(char int1[], char int2[], int m, int n){char result[9];
for (m = 0; m<9; m++) {result[m] = '0';
}
int count = 8;
char cin = '0';
for (n = 3; n>0; n--) {if(int2[n]!='0'){int i,j = count;
for(i = 3 ;i>=0;i--){if(int1[i] == result[j]){char temp = result[j];
result[j] = cin!='0' ? '1':'0';
cin = temp!='0' ? '1':'0';
}else{result[j] = cin!='0' ? '0':'1';
cin = result[j] !='0' ? '0':'1';
}
j--;
}
}
count--;
}
printf("結(jié)果為:");
for (n = 1; n<9; n++) {printf("%c",result[n]);
if (n==4) {printf(" ");
}
}
return 0;
}
秘訣:一定要看書,一定要看書?。?/code>
那什么我C語言基礎(chǔ)比較差,所以這個整了一周才完成,但是還是很有成就感的,哈哈哈哈哈哈,加油各位!
那啥這只是部分代碼,查看全部代碼 請加qq:1138449792( 主要是為了怕老師說抄作業(yè),我可以給你,原理很簡單的!)
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧