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

博客公布了一段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;
}

### 换负浮点数为16带符号二进制数 在计算机中,16带符号整数通常使用 **二的补码** 表示法来存储正数和负数。然而,16带符号整数只能表示从 -32768 到 +32767 的范围[^1]。由于 -376.1 不是一个整数,并且超出了 16 带符号整数的范围,因此需要明确以下几点: 1. **精度问题**:浮点数无法直接用整数的二进制形式表示。如果希望将 -376.1 换为 16 带符号二进制数,则必须先进行舍入或截断操作,将其换为整数。 2. **范围限制**:即使将 -376.1 截断为 -376,该值仍然在 16 带符号整数的范围内,因此可以直接使用二的补码表示。 以下是具体步骤及代码实现: #### 将 -376 换为 16 二进制数 对于 -376,首先确定其绝对值的二进制表示形式,然后根据二的补码规则生成最终结果。 1. **绝对值的二进制表示**: - 376 的十进制二进制为 `101111000`。 - 扩展为 16 :`0000000101111000`。 2. **计算二的补码**: - 对上述二进制取反:`1111111010000111`。 - 加 1:`1111111010001000`。 最终结果为 `1111111010001000`。 #### Python 实现代码 ```python def decimal_to_16bit_signed_binary(num): if num < -32768 or num > 32767: raise ValueError("Number out of range for 16-bit signed integer") # 使用二的补码规则 if num >= 0: return bin(num)[2:].zfill(16) else: return bin((1 << 16) + num)[2:] # 示例 result = decimal_to_16bit_signed_binary(-376) print(result) # 输出: 1111111010001000 ``` #### 注意事项 - 如果需要保留小数部分,则必须使用浮点数格式(如 IEEE 754 标准),而不能用 16 带符号整数表示。 - 在实际应用中,建议明确需求,例如是否可以扩展到更大的数据类型(如 32 或 64 )以支持更大的范围或更高的精度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值