通过C语言实现小数整数求原码,反码,补码

判断输入的值是整数还是小数,是正是负

j、k都是用来标记的

void judge(double x){
	double i=x;
	//判断是正是负 
	if(i<0){
		j=1;
		i=-i;
	}
	else j=0;
	//判断是纯小数还是纯整数 
	int n=i/1;
	double l=i-n;
	if(n>=1&&l==0){
		//printf("纯整数\n");
		k=1;
	}
	else if(n==0&&l>0){
		//printf("纯小数\n"); 
		k=-1;
	}
	else {
		//printf("请输入纯小数或者纯整数\n");
		k=0;
	}
} 

求纯整数不含符号的原码

这里采用了递归的方法求整数原码,函数名起的有点草率
a数组是用来存储整数原码的数组

void digui(int i){
	if(i==0){
		return;
	}
	else {
		digui(i/2);
		a[s++]=i%2;
		return;
	}
}

求纯小数不含符号的原码

方法主要是while中的方法,b数组是用来存储小数原码的数组,

void digui1(double i){
	int ss=0;
	double x=i;
	while(x!=0){
		x=x*2;
		if(x>1){
			x=x-(int)x;
			b[ss++]=1;
		}
		else if(x<1){
			b[ss++]=0;
		}}
	if(ss>20) ss=20;//限制小数位数
	for(int m=0;m<ss;m++)//在该方法直接输出小数原码结果
		printf("%d",b[m]);
	for(int m=0;m<ss;m++)//结果存入c数组
		c[cc++]=b[m]+'0';
 
}

完善整个原码(符号、小数、整数合在一起)

通过K的值来判断是纯小数还是纯整数或者是整数小数一体
通过j的值来判断输入的值是正是负,进而输出对应的0 或 1

if(k==1){
		int i1=i;
		if(i<0) 
			i1=-i1;
		s=0;
		digui(i1);
		int s1=s; s=0;
		if(j==1){
			printf("1,");
			c[0]='1';
			c[1]=',';
		}
		else{
			printf("0,"); 
			c[0]='0';
			c[1]=',';
		} 
		cc=2;
		for (int m=0;m<s1;m++)
			printf("%d",a[m]);
		printf("\n");
		for(int m=0;m<s1;m++)
			c[cc++]=a[m]+'0';
	}
	else if(k==-1){
		double i2=i;
		if(i<0) 
			i2=-i2;
		if(j==1){
			printf("1.");
			c[0]='1';
			c[1]='.';
		}
		else{
			printf("0."); 
			c[0]='0';
			c[1]='.';
		}
		cc=2;
		//printf("i2的值:%lf\n",i2); 
		digui1(i2);
		printf("\n");
	}
	else if(k==0){
		int i3=i;
		double i4=i-i3;
		if(i3<0) {
			i3=-i3;
			i4=-i4;
		}
		if(j==1){
			printf("1,");
			c[0]='1';
			c[1]=',';
		}
		else{
			printf("0,"); 
			c[0]='0';
			c[1]=',';
		} 
		cc=2;s=0;
		digui(i3);
		for(int l=0;l<s;l++){
			printf("%d",a[l]);
		}
		for(int l=0;l<s;l++){
			c[cc++]=a[l]+'0';
		}
		c[cc++]='.';
		printf(".");
		digui1(i4);
		printf("\n");
	}
	
}

将求原码的函数封装在一个函数里

void Binary_source(double n){
	judge(n); 
	Original(n);
}

求反码的函数

void Fbinary_source(char a[]){
	if(c[0]=='0'){
		for(int m=0;m<cc;m++){
		printf("%c",c[m]);
	}
	}
	else {
		for(int m=2;m<cc;m++){
		if(c[m]=='1') c[m]='0';
		else if(c[m]=='0') c[m]='1';
		
	}
	for(int m=0;m<cc;m++){
		printf("%c",c[m]);
	}
	
	}printf("\n");
	
}

求补码的函数

负数的补码=反码+1
实现满2进1,直接从末尾开始找1,遇见1就变0,遇到0就变1 再跳出循环。

void Complement_number(char a[]){

	if(c[0]=='0'){
		for(int m=0;m<cc;m++){
		printf("%c",c[m]);
	}
	}
	else {
		for(int m=cc-1;m>2;m--){
		if(c[m]=='1') c[m]='0';
		else if(c[m]=='0') {
			c[m]='1';
			break;
		}
		
	}
	for(int m=0;m<cc;m++){
		printf("%c",c[m]);
	}
	
	}printf("\n");
	
}

main函数

0是特殊情况,单独拿出来写了

int main(){
	while(true){
	double n;
	printf("请输入十进制真值:");
	scanf("%lf",&n);
	if(n==0){
		printf("+0:\n"); 
		printf("原码:00000000\n反码:00000000\n补码:00000000\n");
		printf("-0:\n"); 
		printf("原码:10000000\n反码:11111111\n补码:00000000\n");
		continue;
	}
	printf("原码:"); 
	Binary_source(n);
	printf("C[]中的值:");
	c[cc]='\0';
//	for(int i=0;i<2;i++) printf("%s",c[i]);
	puts(c);
	printf("反码:");
	Fbinary_source(c);
	printf("补码:");
	Complement_number(c);
	}
} 

整个实现代码

#include<stdio.h>
int j,k;//标识输入的数纯整数还是纯小数 
int a[200],s=0,b[200],cc=0;
char c[1000];
void judge(double x){
	double i=x;
	//判断是正是负 
	if(i<0){
		j=1;
		i=-i;
	}
	else j=0;
	//判断是纯小数还是纯整数 
	int n=i/1;
	double l=i-n;
	if(n>=1&&l==0){
		//printf("纯整数\n");
		k=1;
	}
	else if(n==0&&l>0){
		//printf("纯小数\n"); 
		k=-1;
	}
	else {
		//printf("请输入纯小数或者纯整数\n");
		k=0;
	}
} 
//递归求纯整数不含符号的二进制原码 
void digui(int i){
	if(i==0){
		return;
	}
	else {
		digui(i/2);
		a[s++]=i%2;
		return;
	}
}
//求纯小数不含符号的二进制原码 
void digui1(double i){
	int ss=0;
	double x=i;
	while(x!=0){
		x=x*2;
		if(x>1){
			x=x-(int)x;
			b[ss++]=1;
		}
		else if(x<1){
			b[ss++]=0;
		}}
	if(ss>20) ss=20;
	for(int m=0;m<ss;m++)
		printf("%d",b[m]);
	for(int m=0;m<ss;m++)
		c[cc++]=b[m]+'0';
 
}
//完整的二进制原码 
void Original(double i){
	if(k==1){
		int i1=i;
		if(i<0) 
			i1=-i1;
		s=0;
		digui(i1);
		int s1=s; s=0;
		if(j==1){
			printf("1,");
			c[0]='1';
			c[1]=',';
		}
		else{
			printf("0,"); 
			c[0]='0';
			c[1]=',';
		} 
		cc=2;
		for (int m=0;m<s1;m++)
			printf("%d",a[m]);
		printf("\n");
		for(int m=0;m<s1;m++)
			c[cc++]=a[m]+'0';
	}
	else if(k==-1){
		double i2=i;
		if(i<0) 
			i2=-i2;
		if(j==1){
			printf("1.");
			c[0]='1';
			c[1]='.';
		}
		else{
			printf("0."); 
			c[0]='0';
			c[1]='.';
		}
		cc=2;
		//printf("i2的值:%lf\n",i2); 
		digui1(i2);
		printf("\n");
	}
	else if(k==0){
		int i3=i;
		double i4=i-i3;
		if(i3<0) {
			i3=-i3;
			i4=-i4;
		}
		if(j==1){
			printf("1,");
			c[0]='1';
			c[1]=',';
		}
		else{
			printf("0,"); 
			c[0]='0';
			c[1]=',';
		} 
		cc=2;s=0;
		digui(i3);
		for(int l=0;l<s;l++){
			printf("%d",a[l]);
		}
		for(int l=0;l<s;l++){
			c[cc++]=a[l]+'0';
		}
		c[cc++]='.';
		printf(".");
		digui1(i4);
		printf("\n");
	}
	
}
void Binary_source(double n){
	judge(n); 
	Original(n);
}
void Fbinary_source(char a[]){
	if(c[0]=='0'){
		for(int m=0;m<cc;m++){
		printf("%c",c[m]);
	}
	}
	else {
		for(int m=2;m<cc;m++){
		if(c[m]=='1') c[m]='0';
		else if(c[m]=='0') c[m]='1';
		
	}
	for(int m=0;m<cc;m++){
		printf("%c",c[m]);
	}
	
	}printf("\n");
	
}
void Complement_number(char a[]){

	if(c[0]=='0'){
		for(int m=0;m<cc;m++){
		printf("%c",c[m]);
	}
	}
	else {
		for(int m=cc-1;m>2;m--){
		if(c[m]=='1') c[m]='0';
		else if(c[m]=='0') {
			c[m]='1';
			break;
		}
		
	}
	for(int m=0;m<cc;m++){
		printf("%c",c[m]);
	}
	
	}printf("\n");
	
}
int main(){
	while(true){
	double n;
	printf("请输入十进制真值:");
	scanf("%lf",&n);
	if(n==0){
		printf("+0:\n"); 
		printf("原码:00000000\n反码:00000000\n补码:00000000\n");
		printf("-0:\n"); 
		printf("原码:10000000\n反码:11111111\n补码:00000000\n");
		continue;
	}
	printf("原码:"); 
	Binary_source(n);
	printf("反码:");
	Fbinary_source(c);
	printf("补码:");
	Complement_number(c);
	}
} 

测试数据结果

在这里插入图片描述


版权声明:本文为qq_46003905原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。