给出一个十进制数,可以是整数,也可以是小数。经过数据处理之后,输出这个数的原码,反码,补码,和移码的表示方法。其中整数部分和小数部分分别用32位机器数表示。再输出这个数的IEEE754单精度浮点数。

#include "stdio.h"
#include <stdlib.h>
#include <string.h>
#define TTWO 32
#define TONE 31
//*x>-2147483648     && x<2147483648;
#define MAXSIZE 65
void function_one(double m)
{
    char sign;//符号
    char Stack[MAXSIZE];//栈
    int top=-1,i=0,Zhengshu_len=0,Xiaoshu_len = 0,e,e_len=0,Finally_len=0;
    char yushu;
    int zhengshu;
    char Zhengshu[MAXSIZE];
    char Xiaoshu[MAXSIZE];
    char Finally[MAXSIZE];
    int SignedInteger;//x的整数部分
    float decimal;//x的小数部分
   // printf("请输入一个有符号的十进制数:");
   // scanf(" %c",&sign);
   if(m>0)
   {
       sign='+';
   }
   else if(m<0)
   {
       sign='-';
       m=-m;
   }

        SignedInteger = (int) m;
        decimal = m - SignedInteger;
        //十进制整数部分转bai二进制
        if(SignedInteger ==0 && decimal==0)
        {
            printf("0000 0000 0000 0000 0000 0000 0000 0000\n");
            printf("00000000\n");
        }
        else if(SignedInteger == 0)
        {
            i=0;
            while(decimal>0)
            {
                zhengshu = (int)(decimal*2);
                Xiaoshu[i] =  zhengshu+'0';
                i++;
                decimal = decimal * 2;
                if(decimal>=1) decimal = decimal -1 ;
            }
            Xiaoshu[i] = '\0';
            Xiaoshu_len = i;
            int record=1;//记录
            for(i=0;i<Xiaoshu_len;i++)
            {
                if(Xiaoshu[i]=='0')
                {
                    record++;
                }
                else
                {
                    break;
                }
            }
            e = 127-record;
            printf("e=%d\n",e);
            if(sign=='+')
            {
                Finally[0] = '0';
            }
            else if(sign=='-')
            {
                Finally[0] = '1';
            }
            i = 8;
            while(e)
            {
                yushu = (e%2+'0');
                Finally[i] = yushu;
                i--;
                e = e/2;
            }
             //阶前补0凑八位
            for(i=1;i<=8;i++)
            {
                if(Finally[i]!='1')
                {
                    Finally[i] = '0';
                }
                else
                {
                    break;
                }
            }

            int j = record;
            //补小数,因为没有整数部分
            for(i=9;i<9+Xiaoshu_len+record;i++)
            {
                Finally[i] = Xiaoshu[j++];
            }
            Finally_len = strlen(Finally);
            for(i=Finally_len;i<32;i++)
            {
                Finally[i] = '0';
            }
            for(i=0;i<32;i++)
            {
                printf("%c",Finally[i]);
                if(i%4==0)
                {
                    printf(" ");
                }
            }
            putchar('\n');
        }

        else{
            while(SignedInteger)
            {
                yushu = (SignedInteger%2+'0');
                top++;
                Stack[top] = yushu;
                SignedInteger = SignedInteger/2;
            }
            while(top!=-1)
            {
                Zhengshu[i] = Stack[top];
                top--;
                i++;
            }
            Zhengshu[i] = '\0';
            Zhengshu_len  = i;
            //十进制小数转二进制
            i=0;
            while(decimal>0)
            {
                zhengshu = (int)(decimal*2);
                Xiaoshu[i] =  zhengshu+'0';
                i++;
                decimal = decimal * 2;
                if(decimal>=1) decimal = decimal -1 ;
            }
            Xiaoshu[i] = '\0';
            Xiaoshu_len = i;
            e = 127+Zhengshu_len-1;
        //求阶
            printf("e=%d\n",e);
            i = 8;
            while(e)
            {
                yushu = (e%2+'0');
                Finally[i] = yushu;
                i--;
                e = e/2;
            }
            //阶前补0凑八位
            for(i=1;i<=8;i++)
            {
                if(Finally[i]!='1')
                {
                    Finally[i] = '0';
                }
                else
                {
                    break;
                }
            }
            if(sign=='+')
            {
                Finally[0] = '0';
            }
            else if(sign=='-')
            {
                Finally[0] = '1';
            }
            int j=1;
            //添加整数部分
            for(i=9;i<9+Zhengshu_len-1;i++)
            {
                Finally[i] = Zhengshu[j++];
            }
            Finally[i] = '\0';
            Finally_len = strlen(Finally);
            j=0;
            //添加小数部分
            for(i=Finally_len;i<Finally_len+Xiaoshu_len;i++)
            {
                Finally[i] = Xiaoshu[j++];
            }
            Finally[i]='\0';

            Finally_len = strlen(Finally);
            for(i=Finally_len;i<32;i++)
            {
                Finally[i] = '0';
            }
            for(i=0;i<32;i++)
            {
                printf("%c",Finally[i]);
                if(i%4==0)
                {
                    printf(" ");
                }
            }
            putchar('\n');
        }
                    //转化为16进制
        if(x!=0)
        {
            int sum=0,j=1,t=8;
            for(i=0;i<32;i++)
            {
                // printf("!%d\n",Finally[i]-'0');
                sum+=t*(int)(Finally[i]-'0');
                //printf("*%d\n",sum);
                t = t/2;
                //sum = (int)(Finally[i]-'\0')*8+ (int)(Finally[i]-'\0')*4 +(int)(Finally[i]-'\0')*2+ (int)(Finally[i]-'\0')*1;
                if(j%4==0)
                {
                    t = 8;
                    //printf("sum=%d\n",sum);
                    if(sum==10) printf("A");
                    else if(sum==11) printf("B");
                    else if(sum==12) printf("C");
                    else if(sum==13) printf("D");
                    else if(sum==14) printf("E");
                    else if(sum==15) printf("F");
                    else printf("%d",sum);
                    sum=0;
                }


                j++;
            }
            putchar('\n');
        }

}
void integertrueform(int x,int map[])
{    if(x>=0) map[TONE]=0;
    if(x<0) {map[TONE]=1; x=-x;}
    int i=1;
    while(x&&(i-TTWO))
    {
        map[i-1]=x%2;
         i++;
         x=x/2;
     }
}
void decimaltrueform(double x,int map[])
{    if(x>=0) map[TONE]=0;
    if(x<0) {map[TONE]=1; x=-x;}
    int i=TONE;
    while(x!=0&&i)
    {    x=x*2;
        if(x>=1) {map[i-1]=1;x--;}
        else map[i-1]=0;
        i--;
    }
}
void ptrueform(int map[])
{
    int i=TTWO;
    while(i)
     {
         printf("%d",map[i-1]);
        i--;
     }
}
int onescomplement(int map[])
{    int i;
    if(map[TONE]==0)
    {
        return 0;
    }
    else
    {    i=TONE;

        while(i>0)
        {
            if(map[i-1]==1)     map[i-1]=0;
            else     map[i-1]=1;
            i--;
        }

    }
}
void ponescomplement(int map[])
{
    int i=TTWO;
    while(i>0)
    {
        printf("%d",map[i-1]);
        i--;
    }
}
int complemental(int map[])
{    if(map[TONE]==0) return 0;
    else
    {    int i=0;
        while(map[i]&&i<TTWO)
        {
            map[i++]=0;
        }
        map[i]=1;
    }function_one(ti);
}
void pcomplemental(int map[])
{
    int i=TTWO;
    while(i>0)
    {
        printf("%d",map[i-1]);
        i--;
    }
}
int excess(int map[])
{
    if(map[TONE]==1) map[31]=0;
    else map[TONE]=1;
}
void pexcess(int map[])
{
    int i=TTWO;
    while(i>0)
    {
        printf("%d",map[i-1]);
        i--;
    }
}

main()
{    int a[TTWO]={0},z[TTWO]={0};
    int ti = 0;
    double td = 0;
    double tdf=0;
    int tdi=0;
    char str[10]="";
    printf("请输入一个十进制数:");
    scanf("%s",str);    // 先存成字符串
    if (NULL == strchr(str, '.'))   // 等于NULL是没有找到小数点
    {
        sscanf(str, "%d", &ti);  // 再从字符串格式化成整型
        printf("输入的是定点整型:%d\n", ti);
          integertrueform(ti,a);
        printf("原码:");
        ptrueform(a);
        function_one(ti);//IEEE754
        printf("\n");
        onescomplement(a);
        printf("反码:");
        ponescomplement(a);
        printf("\n");
        complemental(a);
        printf("补码:");
        pcomplemental(a);
        printf("\n");
        excess(a);
        printf("移码:");
        pexcess(a);
        printf("\n");
    }
    else
    {
        sscanf(str, "%lf", &td);  // 再从字符串格式化成浮点型
        printf("输入的是浮点数:%lf\n", td);
        if(td<1&&td>-1)
        {
              decimaltrueform(td,a);
            printf("定点小数原码:");
            ptrueform(a);
            printf("\n");
            onescomplement(a);
            printf("定点小数反码:");
            ponescomplement(a);
            printf("\n");
            complemental(a);
            printf("定点小数补码:");
            pcomplemental(a);
            printf("\n");
            excess(a);
            printf("定点小数移码:");
            pexcess(a);
            printf("\n");

        }
        if(td>=1||td<=-1)
        {
            tdi=(int)td;
            tdf=td-tdi;
            integertrueform(tdi,a);
            decimaltrueform(tdf,z);

            printf("原码整数部分:");
            ptrueform(a);
            printf("        ");
            printf("原码小数部分:");
            ptrueform(z);
            printf("\n");

            onescomplement(a);
            printf("反码整数部分:");
            ponescomplement(a);
            printf("        ");
            onescomplement(z);
            printf("反码小数部分:");
            ponescomplement(z);
            printf("\n");

            complemental(a);
            printf("补码整数部分:");
            pcomplemental(a);
            printf("        ");
            complemental(z);
            printf("补码小数部分:");
            pcomplemental(z);
            printf("\n");

            excess(a);
            printf("移码整数部分:");
            pexcess(a);
            printf("        ");
            excess(z);
            printf("移码小数部分:");
            pexcess(z);
            printf("\n");

        }
       function_one(td);
    }


}

运行结果

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 原码就是一个字的二进制表示反码就是将原码中的每一位取反,十进制转换为二进制可以用除2取余的方法,二进制转换为十进制可以用二进制的权重相加的方法。例如:十进制10转换为二进制1010,其原码为1010,反码为1101,二进制11.11转换为十进制为3.75,其原码为11.11,反码为00.00。 ### 回答2: 二进制是计算机中最常用的制系统,它由0和1两个字组成。在进行二进制的转换时,我们需要了解原码反码的概念。 原码是二进制的最基本表示形式,它是将十进制直接转换为二进制的形式。例如,十进制6在二进制中的原码是110。 反码原码的一种特殊形式,它的计算方法是对原码的每个位进行取反操作。也就是说,0变为1,1变为0。例如,原码110的反码是001。 对于整数的二进制,如果最高位为1,表示为负。为了能够表示,我们需要引入补码的概念。 补码反码加1得到的结果。例如,原码110的反码是001,补码则是010。 对于小数的二进制,我们通常使用定点表示法。将小数点固定在某个位置,左边的部分表示整数位,右边的部分表示小数位。 在十进制和二进制之间的转换中,我们可以使用乘二取整法和除二取余法。 对于整数的转换,乘二取整法是将十进制每次乘以2,然后将结果的整数部分作为二进制的对应位。例如,十进制13转换为二进制是1101。 对于小数的转换,除二取余法是将十进制每次除以2,然后将结果的小数部分作为二进制的对应位。例如,十进制0.75转换为二进制是0.11。 综上所述,二进制原码反码补码表示整数在计算机中的存储方式,而定点表示法可以用来表示小数。通过乘二取整法和除二取余法,我们可以进行十进制和二进制之间的转换。 ### 回答3: 二进制是一种使用两个字0和1来表示值的计系统。在二进制中,每个位上的字称为比特或二进制位。二进制可以分为整数小数两种类型。 对于整数二进制原码表示法是最简单的表示方法。该方法直接将十进制转化为二进制,并在最高位添加一个符号位,0表示,1表示。例如,十进制7在原码表示法中对应的二进制为0111,-7对应的二进制为1111。 反码是在原码基础上的变化,用于表示反码的求解方法是将原码中的符号位保持不变,其他位按位取反。例如,十进制7对应的反码为0111,-7对应的反码为1000。 在十进制和二进制之间进行转换时,只需将每个位权上的字进行乘法运算,并将结果相加。例如,十进制13的二进制表示为1101,计算方法为1 * 2^3 + 1 * 2^2 + 0 * 2^1 + 1 * 2^0 = 8 + 4 + 0 + 1 = 13。同样地,二进制1101的十进制表示为1 * 2^3 + 1 * 2^2 + 0 * 2^1 + 1 * 2^0 = 8 + 4 + 0 + 1 = 13。 对于小数二进制原码反码的求解方法整数相同。例如,十进制0.5的二进制表示为0.1,计算方法是1 * 2^(-1) = 0.5。同样地,二进制0.1的十进制表示为1 * 2^(-1) = 0.5。 综上所述,二进制原码反码以及十进制和二进制的转换方法都是根据位权的乘法运算规则。无论是整数还是小数,通过对每个位进行权重计算并相加,可以准确地进行转换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值