有趣c语言例题之明码
明码
解题思路:
本题主要用到十进制与二进制的转换
输出时主要是每行输出两个十进制数转为二进制的格式输出
负数转二进制用到补码
首先,来个-5,实践出真知嘛。把5转化为二进制字节形式。得到101,然后补零。这个时候,原码就出来了。然后,取反(0的变成1,1的变成0。)/一个整数按照绝对值大小转换成的二进制数,是为原码。原码就上面的:00000101。/3得到了反码,嗯,反码是和原码反着来的。然后,加一。//反码加一叫补码。步骤阅读4补码就是负数在计算机中的二进制表示方法。那么,11111011表示8位的-5,如果要表示16位的-5 ,在左边添上8个1即可。
#include<stdio.h>
int main(){
int i,j,k,l,a[32],b[16];
for(j=0;j<10;j++){
for(i=0;i<32;i++){
scanf("%d",&a[i]);
}
for(i=0;i<32;i=i+2){
if(a[i]>=0){ //正整数转二进制
for(k=7;k>=0;k--){
b[k]=a[i]%2;
a[i]=a[i]/2;
}
}
if(a[i]<0){ 负数转二进制
a[i]=-a[i];
for(k=7;k>=0;k--){
b[k]=1-a[i]%2;
a[i]=a[i]/2;
}
if(b[7]==0){
b[7]=b[7]+1;
goto A;
}
if(b[7]==1){
for(k=7;k>=0;k--){
if(b[k]==0) {
b[k]=1;
break;
}
if(b[k]==1) b[k]=0;
}
}
}
A:if(a[i+1]>=0){
for(k=15;k>=8;k--){
b[k]=a[i+1]%2;
a[i+1]=a[i+1]/2;
}
}
if(a[i+1]<0){
a[i+1]=-a[i+1];
for(k=15;k>=8;k--){
b[k]=1-a[i+1]%2;
a[i+1]=a[i+1]/2;
}
if(b[15]==0){
b[15]=b[15]+1;
goto B;
}
if(b[15]==1){
for(k=15;k>=8;k--){
if(b[k]==0){
b[k]=1;
break;
}
if(b[k]==1) b[k]=0;
}
}
}
B:for(k=0;k<16;k++){
printf("%d",b[k]);
}
printf("\n");
}
}
return 0;
}