正数的补码是原码;
负数的补码是反码加一。
因此,问题就简单了,如下图所示:
补码的存在是为了方便CPU进行计算的,当前几乎所有主流的CPU中都是通过累加器和移位寄存器等进行运算的,不会特别设计硬件电路来进行减法运算,通过补码,就可以将减法统一到加法中。
当然,对于用户而言,求原码、补码都是CPU自己完成的,不需要用户自己转换。了解补码会更好的帮助你了解CPU的计算原理。
贴一下源代码和运行截图。
#include
#define N 8 //这里你要求是8位
int main(int argc, const char * argv[]) {
int binary[8];//用于存放最后取得的补码
int a=0;//要处理的数值
int a1=0;//保存a的值
int m=0;//用于存放临时的数值
printf(请输入要转换成二进制补码的数的值:\n);
scanf(%d,&a);
a1=a;
if (a==0) {
for (int i=0; i
binary=0;
}
}else if (a
binary[0]=1;
a=-a;
//求原码部分开始
for (int i=N-1; i>0; i--) {
binary=a%2;
a=a/2;
if (a
m=i;
break;
}
}//求源码部分结束
printf(%d的原码值为: ,a1);
for (int i=0; i
printf(%d,binary);
}
printf(\n);
for (int i=m; i
if (binary==0) {
binary=1;
}
else binary=0;
}
binary[N-1]=binary[N-1]+1;
for (int i=N-1; i>0; i--) {
if (binary>1) {
binary=0;
binary[i-1]=binary[i-1]+1;
if (binary[i-1]
break;
}
}
}
//负数部分结束
}else{
binary[0]=0;
for (int i=N-1; i>0; i--) {
binary=a%2;
a=a/2;
if (a
m=i;
break;
}
}
for (int i=1; i
binary=0;
}
printf(%d的原码值为: ,a1);
for (int i=0; i
printf(%d,binary);
}
printf(\n);
}
printf(%d的补码值为: ,a1);
for (int i=0; i
printf(%d,binary);
}
printf(\n);
return 0;
}