通过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版权协议,转载请附上原文出处链接和本声明。