#include<iostream>
using namespace std;
int First_contrary[200];//这个数组存放整数转化过来的二进制,是倒顺序
int Second_normal[200];//这个把倒顺序,变成正顺序后存放在这里
int *pFirst_contrary=First_contrary;//为了能改变其值,用指针
int *pSecond_normal=Second_normal;
void Translator(int x);//转化整数为二进制的函数
void Print(int x);//打印十六进制
void Print754(int I3E754[],int E);//打印最终结果的函数
void Translator_xiao(double x);//转化小数为二进制的函数
void main()
{
int i=0;
for(int k(0);;k++)//死循环,确保可以一直输入
{
int I3E754[33];//存放最终754的结果,设了33为,第一位没要,为的是存储位置与实际位置相对应
if(k==0)//如果是第一次,运行,则输入下面的语句。
{
cout<<" 这个程序的功能是把一个数转化为IEEE754制32位二进制的形式。马正东制作。所有权利保留。不得用于商业用途,仅供学习交流之用."<<endl;
cout<<" 输入的数不要过大,也不要过小,小数位不得小于6位,整数部分不得大于21亿,否则会出现乱码,由于目前个人能力有限,还不能在大范围内使用,但可满足一般需求。"<<endl;
cout<<endl<<endl;
}
cout<<"请输入一个数:"<<endl;
double input_number;//输入的数存放在这里面
cin>>input_number;
cout<<endl<<endl;
if(input_number==0)//对0的处理
{
cout<<"0有正0和负0之分."<<endl;
cout<<"当以正0看待时,如下表示:"<<endl;
for( i=1;i<=32;i++)
I3E754[i]=0;
Print754(I3E754,0);
cout<<"当以负0看待时,如下表示:"<<endl;
for( i=1;i<=32;i++)
{
if(i==1)
I3E754[i]=1;
else
I3E754[i]=0;
}
Print754(I3E754,0);
}
else//如果不为0的处理
{
double positive_number;//把数转化为绝对值后存放在这里
if(input_number>0)
positive_number=input_number;
if(input_number<0)
positive_number=-input_number;
int zheng_shu;
zheng_shu=positive_number;//开始把整数部分提取出来
int jiema[8];//存放阶码的数组
int flagz;//要用的整数的位数,用这个来记
int zheng[200];//存放整数的二进制数组
int E;//阶码的10进制表示存放在这里
if(zheng_shu>=1)//如果不为小数,则执行如下操作
{
Translator(zheng_shu);//将整数转化为二进制
flagz=First_contrary[199];//提取,将要用到得整数位数的个数
for(int i(0);i<=flagz;i++)
zheng[i]=Second_normal[i];//将转化的结果存放到一个数组中
int e=First_contrary[199];//这是阶码的实际值,没有移码之前的值
E=e+127;//开始求移位后的阶码
}
int xiaoshu[23];//存放小数的数组
double xiao_shu=positive_number-zheng_shu;//得到小数
Translator_xiao(xiao_shu);//把小数转化二进制
int counter;//用来记小数的二进制第一个1前有多少个0
if(zheng_shu==0)
{
flagz=0;//此种情况下没有整数位
counter=0;
for(int i(0);;i++)
{
if(Second_normal[i]==0)
counter++;//开始计数0
else
break;
}
for(i=counter;i<=counter+23;i++)
xiaoshu[i-counter]=Second_normal[i];//把有用的小数位存放到一个数组中
E=127-counter-1;//在纯小数的情况下,计算移位阶码的值
}
if(zheng_shu>=1)///以下执行的不是纯小数的情况
for(int i(0);i<=22;i++)
xiaoshu[i]=Second_normal[i];//此时,不再计算0的个数,直接把小数转化为2进制的结果拿过来
Translator(E);//开始把阶码转化为二进制的形式
int flagj=First_contrary[199];//记录到底得到多少位阶码,因为计算机不知道你是限制为8位的,当不够8位时,它不给你在高位上补0
if(flagj<7)//如果不够8为时,注意,这里用的是下标表示,下标是从0开始的,不是1开始的,所以比正常位置小1
{
for( i=0;i<7-flagj;i++)
jiema[i]=0;//当不够8位时,开始给高位补0
for( i=7-flagj;i<=7;i++)
jiema[i]=Second_normal[i-7+flagj];///这样就得到了8位阶码
}
else//如果阶码已经是8位了
for( i=0;i<=7;i++)
jiema[i]=Second_normal[i];//那就直接拿过来用了
I3E754[0]=0;//这个数组的第一位,我是不用的,所以就随便给他赋值
if(input_number>0)
I3E754[1]=0;//是正数,则第一位为0,注意,我这里说的第一位,指的是下标为一,上面那句话是真正的第一位,不要混淆了。
else
I3E754[1]=1;//负数用1表示
for(int i=2;i<=9;i++)
I3E754[i]=jiema[i-2];//把阶码导入到最终结果中
if(flagz<=22)//开始导入尾数,现在的情况是整数的位数没有把23位全部用完
{
for( i=0;i<=flagz-1;i++)
I3E754[10+i]=zheng[i+1];
for( i=10+flagz;i<=32;i++)//把整数用的剩下的用小数补上
I3E754[i]=xiaoshu[i-10-flagz];
}
else
for( i=10;i<=32;i++)//如果整数的有效位大于23的话,就直接把它的东西贴到尾数的23位上,不管小数了
I3E754[i]=zheng[i-10+1];
Print754(I3E754,E);//开始打印最终结果
}
}
}
void Translator(int x)
{
int temp,i;
for(i=0;;i++)
{
*(pFirst_contrary+i)=x%2;//现在转为整数转二进制的方法
temp=x/2;
x=temp;
if(temp==0)
{
*(pFirst_contrary+199)=i;//存放整数的位数,其实是i+1,但i直接就是将要取的有效位数的整数的个数
break;
}
}
for(int j(0);j<=i;j++)
*(pSecond_normal+j)=*(pFirst_contrary+i-j);//上面的顺序是反得,我还得把它再变成正常顺序
}
void Print(int x)
{
switch (x)//这里是对于十六进制的数字处理
{
case(10):
cout<<'A';
break;
case(11):
cout<<'B';
break;
case(12):
cout<<'C';
break;
case(13):
cout<<'D';
break;
case(14):
cout<<'E';
break;
case(15):
cout<<'F';
break;
}
}
void Translator_xiao(double x)//这里是转化小数位二进制的形式
{
int i=0;
for( i=0;i<200;i++)
*(pSecond_normal+i)=0;//小数的自身特性,直接就是正常的顺序,不用再换顺序了
double temp=x*2;
for( i=0;i<=22;i++)
{
if(temp<1)
{
*(pSecond_normal+i)=0;
temp*=2;
continue;
}
if(temp>=1)
{
*(pSecond_normal+i)=1;
temp-=1;
temp*=2;
}
}
}
void Print754(int I3E754[],int E)
{
cout<<"符号位为:";
cout<<I3E754[1]<<endl;
cout<<"阶码为:";
cout<<"E: ";
cout<<E;
cout<<" 阶码二进制为: ";
for(int i=2,j=1;i<=9;i++,j++)
{
cout<<I3E754[i];
if(j%4==0)
cout<<" ";
}
cout<<endl;
cout<<"尾数为: ";
for( i=10,j=1;i<=32;i++,j++)
{
cout<<I3E754[i];
if(j%4==0)
cout<<" ";
}
cout<<endl;
cout<<"整个数IEEE754表示为:";
int n(1);
for( i=1;i<=32;i++,n++)
{
cout<<I3E754[i];
if(n%4==0)
cout<<" ";
}
cout<<endl;
int a16[8];///这里是为输出十六进制做的准备
int a[5]={0,8,4,2,1};
for(i=0;i<=7;i++)
{
int sum(0);
for( j=1;j<=4;j++)
sum+=I3E754[i*4+j]*a[j];
a16[i]=sum;
}
cout<<"十六进制表示为: ";
for( i=0;i<=7;i++)
{
if(a16[i]<=9)
cout<<a16[i];
else
Print(a16[i]);
}
cout<<endl<<endl<<endl;
}
- 1
- 2
前往页