#include<stdio.h>
#include<math.h>
int mmmm(int n);//求三个码的
int nnnnnnn(int n[],int m); //n为二进制数,sum为每一位计算所加的和
void main()
{
int s,n=-127;
int m=128;
printf("请输入一个左范围整数: ");
//scanf("%d",&n);
printf("请输入一个右范围整数: ");
//scanf("%d",&m);
printf("\n整数\t原码 二/十进制\t\t");
printf("反码 二/十进制\t\t");
printf("补码 二/十进制\n");
//mmmm(-0);//报错
//mmmm(+0);
while(n<=m)
{
s=n;
if(((-130<s)&&(s<=-118))||((-14<s)&&(s<14))||((118<=s)&&(s<130)))
mmmm(s);
n++;
}
}
int nnnnnnn(int n[],int m)
{ int sum=0,p=1; //n为二进制数,sum为每一位计算所加的和,p为位权
int i=0; //输入该二进制数
while(i<=7) //循环条件为n,即二进制数n在不为0的时候程序一直成立
{
sum+=n[i]*p; //数字中所有位乘以本位的位权再加和
p*=2; //位权随着位的变化依次增加
i++;
} //进行下一位的输出
printf(" %3d",sum);
}
int mmmm(int n)
{
int m,a[10],i=0,y[100],f[100],b[100],j,k;
m=abs(n);
while (m!=0)
{
a[i]=m%2;
m=m/2;
i=i+1;
}
if (n>=0)
{
for(j=0;j<i;j++) y[j]=a[j];
if ((j+1)%8!=0)
for(;(j+1)%8!=0;j++) y[j]=0;
y[j]=0;
for(k=0;k<=j;k++)
{
f[k]=y[k];
b[k]=y[k];
}
}
else
{
int w=0;
for(j=0;j<i;j++) y[j]=a[j];
if ((j+1)%8!=0)
for(;(j+1)%8!=0;j++) y[j]=0;y[j]=1;
for(k=0;k<j;k++) if(y[k]) f[k]=0;
else f[k]=1;f[k]=1;
for( k=0;k<j;k++)
{
if (k==0)b[k]=f[k]+1;
else b[k]=f[k]+w;
if (b[k]==2)
{b[k]=0;w=1;}
else w=0;
}
b[k]=1;
}
if(n==118)
printf(" ...\t.....\t\t\t....\t\t\t....\n");
printf("%5d\t",n);
for(k=j;k>=0;k--)printf("%d",y[k]);
nnnnnnn(y,8);printf("\t\t");
for(k=j;k>=0;k--)printf("%d",f[k]);
nnnnnnn(f,8);printf("\t\t");
for(k=j;k>=0;k--)printf("%d",b[k]);
nnnnnnn(b,8);
printf("\n");
if(n==-118)
printf(" ...\t.....\t\t\t....\t\t\t....\n");
}