#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define datatype int
#define MAX_SIZE 50

#define OK  1
#define Err 0 

/**
*        Code :     By YangLong    2014年9月21日,
*
*        0x00:  函数说明 
*                    XD2B 将任意一个 浮点数 转换为 2 进制
*                    XD2B(double f,char* s, bool z)
*                    参数一:  需要转换的浮点数
*                    参数二:  存放结果的字符数组
*                    参数三:  z = true 时 代表 整数转换
*                             z = false 时 表示浮点数 转换
*
*        0x01    IEEE754(char* s)
*                    参数一: 将 XD2B中的字符数组 转换为 IEEE754格式
*        0x02    不足:
*                    结果显示为 拆分项
*                    要链接起来 用 字符串 拼接 就行
*
*        0x03    待优化: 
*                    结果显示为    16进制
*                    将IEEE754转换为真值
*
*    不是程序复杂,而是编写的有点乱。
*/

typedef struct Stack
{    
    datatype data[MAX_SIZE];
    int top;
}stk;

void Init(stk* s)
{
    s->top = -1;
}

bool push(stk *s,datatype d)
{
    if(s->top+1>MAX_SIZE-1)
    {
        printf(" 'push' Error: Overflow!\n");
                exit(0);
    }
    
    s->data[++s->top] = d;
    return OK;
}

datatype pop(stk* s)
{
    if(s->top<0)
    {
            printf(" 'pop' Error: Overflow!");
                exit(0);
    }
    datatype data = s->data[s->top--];
    return data;
}

bool IsEmpty(stk* s)
{
    return s->top == -1 ? OK : Err;
}


void XD2B(double f,char* s, bool z)
{
    int i=0,j=0;
    stk ss;
    Init(&ss);

    if(f<0) 
    {
        s[0] = '1';
        j = 1;
        f = f*(-1.0);

    }
    else
    {
        s[0] = '0';
        j = 1;
    }
    int q = (int)f;

    while(q)
    {
        push(&ss,q%2);
        q = q/2;
    }
    while(!IsEmpty(&ss))
    {
        s[j++] = pop(&ss) + '0';
    }

    if(z)        // z×××运算
            return;

    s[j++] = '.';
    f = f - (int)f;
    
    while(i<23)
    {
        f = f*2;
        s[j+i] = (int)f + '0';
        f = f - (int)f;
        i++;
    }
}

void IEEE754(char* s)    
{
    
    int j=1,i = 0,q,e,jm=0;
    while(s[++i]!='.');
    int m=1;
    if(i>1)
    {
        while(s[m]!='1' && m<strlen(s)) m++;
        //printf("\n i = %d m= %d i - m = %d ",i,m,i - m-1); //去掉符号位
        jm = i-m-1;
    }
    else
        {
            while(s[m]!='1' && m<strlen(s)) m++;
            //printf("\n i = %d m= %d i - m = %d ",i,m,i - m); //去掉符号位
            jm = i-m;
        }
    int js = jm;
    jm = jm + 127;
    char cjm[16] = {0};
    char ws[65]={0};
    XD2B(jm,cjm,true);    //××× 转换
    printf("\n符号位: %c",s[0]);
    printf("\n阶码: %s\n",&cjm[1]);
    for(q= i -js,e=0; q<strlen(s);q++)
        {
            if(s[q] != '.')
                ws[e++] = s[q];
        }
        printf("尾数: %s",ws);
    


}

void main()
{
    printf("Code By YangLong   0.o\n ");
    printf("IEEE754  ->:");
    char s[80]={0};
    double df=0.0;
    scanf("%lf",&df);
    XD2B(df,s,false);
    printf("%.16lf 二进制小数: ",df);
    bool flag =true;
    int j = 0;
    for(int i=0;i<strlen(s);i++)
    {
        putchar(s[i]);
        if(i == 0) 
        {
                putchar(' '); //符号位
        }
        else if(i%4 ==0 )  //控制
            putchar(' ');
    }
     IEEE754(s);
    printf("\n");
    getchar();
    getchar();

}

wKiom1SNL5nB4Kd_AAEKEkfDx7Y190.jpg