先贴上常规的写法,就是模拟一下手算的过程,这是自己的作业,所以不一定对,而且只能参考,不经允许不得转载。
下面是64位浮点数二进制转十进制
#include <stdio.h>
int main()
{
int i,n,s=0;
double flag,ans=1;
char c;
// char a[100];
printf("Please input a double:\n");
scanf("%c",&c);
if (c=48) flag=1;
else flag=-1;
for (i=1;i<=11;i++)
{
scanf("%c",&c);
s=s*2+(c-48);
}
// printf("%d\n",s);
s=s-1023;
if (s<=-1023)
{
printf("%lf",0);
return 0;
}
for (i=1;i<=52;i++)
{
scanf("%c",&c);
ans=ans*2+c-48;
}
while (ans>=1)
{
ans=ans/2;
}
ans=ans*2;
if (s<0)
{
for (i=1;i<=-s;i++)
{
ans=ans/2;
}
}
else
{
for (i=1;i<=s;i++)
{
ans=ans*2;
}
}
printf("%lf",ans*flag);
/// system("pause");
return 0;
}
整数的二进制转十进制太简单了就不写了
下面是浮点数和整数的十进制转二进制程序,写了很多模块,显得比较长,希望大佬提出改进意见
#include <stdio.h>
int main()
{
char c;
printf("Please input:\n");
printf("D:double\n");
printf("F:float(single)\n");
printf("I:integer(int32)\n");
printf("S:short integer(int16)\n");
// printf("L:long long(int64)\n");
printf("E:exit\n");
while (1)
{
scanf("%c",&c);
switch (c)
{
case 'D':dchange();break;
case 'F':fchange();break;
case 'I':ichange();break;
case 'S':schange();break;
// case "L":lchange();
case 'E':return 0;
}
printf("\n");
}
return 0;
}
int dchange()
{
int i,top=0,flag=0,cnt=0;
int a[100]={0};
int b[100]={0};
int c[100]={0};
double k;
int l=0,ll=0;
long long d;
printf("Please input number:\n");
scanf("%lf",&k);
if (k==0)
{
printf("0000000000000000000000000000000000000000000000000000000000000000") ;
return 0;
}
if (k>=0) printf("0");
else
{
k=-k;
printf("1");
}
d=(long long)k;
k=k-d;
while (d!=0)
{
l++;
a[l]=d % 2;
d=d/2;
}
top=l-1;
if (l>0)
{
for (i=l+1;i<=53;i++)
{
b[i]=(int)(k*2);
k=k*2-b[i];
}
}
else
{
cnt=0;
while (cnt<=52)
{
b[cnt]=(int)(k*2);
if ((b[cnt]==1)&&(flag==0))
{
flag=1;
}
k=k*2-b[cnt];
if (flag==1) cnt++;
if (flag==0) top--;
}
}
top=top+1023;
while (top!=0)
{
ll++;
c[ll]=top % 2;
top=top/2;
}
for (i=11;i>=1;i--)
{
printf("%d",c[i]);
}
if (l>0)
{
for (i=l-1;i>=1;i--)
{
printf("%d",a[i]);
}
for (i=l+1;i<=53;i++)
{
printf("%d",b[i]);
}
}
else
{
for(i=1;i<=52;i++)
{
printf("%d",b[i]);
}
}
return 0;
}
int fchange()
{
int i,top=0,flag=0,cnt=0;
int a[100]={0};
int b[100]={0};
int c[100]={0};
float k;
int l=0,ll=0;
long long d;
printf("Please input number:\n");
scanf("%f",&k);
if (k==0)
{
printf("00000000000000000000000000000000") ;
return 0;
}
if (k>=0) printf("0");
else
{
k=-k;
printf("1");
}
d=(long long)k;
k=k-d;
while (d!=0)
{
l++;
a[l]=d % 2;
d=d/2;
}
top=l-1;
if (l>0)
{
for (i=l+1;i<=24;i++)
{
b[i]=(int)(k*2);
k=k*2-b[i];
}
}
else
{
cnt=0;
while (cnt<=23)
{
b[cnt]=(int)(k*2);
if ((b[cnt]==1)&&(flag==0))
{
flag=1;
}
k=k*2-b[cnt];
if (flag==1) cnt++;
if (flag==0) top--;
}
}
top=top+127;
while (top!=0)
{
ll++;
c[ll]=top % 2;
top=top/2;
}
for (i=8;i>=1;i--)
{
printf("%d",c[i]);
}
if (l>0)
{
for (i=l-1;i>=1;i--)
{
printf("%d",a[i]);
}
for (i=l+1;i<=24;i++)
{
printf("%d",b[i]);
}
}
else
{
for(i=1;i<=23;i++)
{
printf("%d",b[i]);
}
}
return 0;
}
int schange()
{
int i,top=0,flag=0,cnt=0;
int a[100]={0};
int b[100]={0};
int c[100]={0};
short d;
int l=0,ll=0;
printf("Please input number:\n");
scanf("%d",&d);
if (d>=0) printf("0");
else
{
d=((-d)^(32767))+1;
printf("1");
}
while (d!=0)
{
l++;
a[l]=d % 2;
d=d/2;
}
for (i=15;i>=1;i--)
{
printf("%d",a[i]);
}
return 0;
}
int ichange()
{
int i,top=0,flag=0,cnt=0;
int a[100]={0};
int b[100]={0};
int c[100]={0};
int d;
int l=0,ll=0;
printf("Please input number:\n");
scanf("%d",&d);
if (d>=0) printf("0");
else
{
d=((-d)^(2147483647))+1;
printf("1");
}
while (d!=0)
{
l++;
a[l]=d % 2;
d=d/2;
}
for (i=31;i>=1;i--)
{
printf("%d",a[i]);
}
return 0;
}
下面是读内存的版本,因为程序自己会帮你把十进制转换成二进制,所以通过指针,我们就可以去偷懒。
#include <stdio.h>
int main()
{
double d;
long long *ll;//如果你的IDE版本和我一样是32位的,就不能用longlong的指针
int* l;
char s1[100],s2[100];
int i;
scanf("%lf",&d);
l=&d;
itoa(l[1],s1,2);//把l指针移动一个步长后指向的数据读出来,并转化成二进制,因为c语言没有输出二进制的选项
itoa(l[0],s2,2);
// ll=&d;
// printf("%016X\n",ll[0]);
printf("%08X%08XH\n",l[1],l[0]);
printf("%032s%032sB",s1,s2);
return 0;
}
#include <stdio.h>
int main()
{
double ans;
int *p;
int i,j,s;
char c;
ans=0;
printf("Please input a double:\n");
p=&ans;
for (i=1;i>=0;i--)
{
s=0;
for (j=1;j<=32;j++)
{
scanf("%c",&c);
s=s*2+(c-48);
}
p[i]=s;
}
printf ("%lf",ans);
}