c 带符号位小数的二进制转十进制

 

就是把十六进制转成二进制用补码求
然后在把二进制转成十进制
FBH最后的H表示的是16进制数
FB转成二进制就是 1111 1011
取反加1就是 1000 0101就是-5了
其中第一位不用取反了 ,因为是负数

带小数的二进制转十进制   看到的都是 理论 没有代码, 今天把自己的公布下,欢迎指正(部分是借用别人的)如有疏漏,恳请指出。
#include <stdio.h>
#include <string.h>
#include <math.h>
void fun2_10(char str[], int j, int len) //带小数的二进制转十进制
{
    int k = j + 1; //将k指向小数部分第一位
    int cetz = 0, cetx = -1;
    double Sumz = 0;
    double Sumx = 0;
    if (str[0] == '1') // 符号位 == 1
    {
        // 逆补码
        for (int i = j - 1; i > 0; i--)
        {
            str[i] -= 1;
            if (str[i] == '0')
                break;
            else
                str[i] = '1';
        }
        // 逆反码
        for (int i = j - 1; i > 0; i--)
            str[i] == '0' ? (str[i] = '1') : (str[i] = '0');
        // 二转十公式
        for (int i = j - 1; i > 0; i--) //整数部分逆向累加
        {

            Sumz += (str[i] - '0') * pow(2, cetz);
            cetz++;
        }
        Sumz = 0 - Sumz; // 取负
    }
    else                   // 符号位 == 0
        for (; j > 0; j--) //整数部分逆向累加
        {

            Sumz += (str[j - 1] - '0') * pow(2, cetz);
            cetz++;
        }

    //

    for (; k < len; k++) //小数部分正向累加
    {
        Sumx += (str[k] - '0') * pow(2, cetx);
        cetx--;
    }
    printf("%lf\n", Sumz + Sumx); //整数部分加小数部分
}
int main()
{
    int j, k;
    char str[100];
    strcpy(str, "001000010.1000010");   //66.515625
  //  strcpy(str, "101010111.1001010");  // -168.421875
    int len = strlen(str);    //统计字符串长度
    for (j = 0; j < len; j++) //统计整数部分长度
    {
        if (str[j] == '.')
            break;
    }
    fun2_10(str, j, len);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值