c语言二进制转十六进制

带小数的二进制数以2的次方的计算方法进行转换16进制数的c语言代码

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/1104268
  • 这篇博客也不错, 你可以看下c语言实现二进制八进制十进制和十六进制的相互转化
  • 除此之外, 这篇博客: C语言把浮点数转换为二进制数的方法和示例中的 2、小数部分转二进制字符串的方法 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    1)把小数乘以2,假设结果是s,如果s大于1,该位二进制值为1,如果小于1,该位二进制值为0;

    2)把上一步的结果s去掉整数位,只保留小数位,假设得到结果xs,如果xs等于0,转换结束,如果xs大于0,重复第1)步。

    例如0.2转换为二进制:

    0.2*2=0.4 0

    0.4*2=0.8 0

    0.8*2=1.6 1

    0.6*2=1.2 1

    0.2*2=0.4 0

    …… 无限循环

    浮点数123.2,转换为二进制的结果是1111011.00110011001100110011(小数点后保留20位)。

  • 您还可以看一下 李飞老师的C语言开发之数据结构与算法二课程中的 堆的其他应用场景小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    我会尽力回答你的问题。将带小数的二进制数转换为十六进制数的过程可以分为三步:

    1. 将带小数的二进制数转换成浮点数

    2. 将浮点数转换成十六进制数

    3. 输出结果

    具体的代码如下所示:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    union float_to_int {
        float f;
        int i;
    };
    
    char* float_to_hex(float value) {
        char* result;
        int sign, exp, frac;
        int i, j = 0;
        result = (char*) malloc(9 * sizeof(char));
        union float_to_int fi;
        fi.f = value;
        sign = (fi.i >> 31) & 0x1;
        exp = (fi.i >> 23) & 0xff;
        frac = fi.i & 0x7fffff;
        j += sprintf(&result[j], "%c", sign ? '-' : '+');
        if (exp == 0 && frac == 0) {
            strcat(result, "0");
            return result;
        }
        if (exp == 0xff && frac == 0) {
            strcat(result, "inf");
            return result;
        }
        if (exp == 0xff && frac != 0) {
            strcat(result, "nan");
            return result;
        }
        j += sprintf(&result[j], "0x");
        if (exp == 0) {
            j += sprintf(&result[j], "0.");
            for (i = 0; i < 6; ++i) {
                if (frac & (1 << (22 - i))) {
                    sprintf(&result[j], "1");
                } else {
                    sprintf(&result[j], "0");
                }
                j++;
            }
        } else {
            j += sprintf(&result[j], "1.");
            for (i = 0; i < 23; ++i) {
                if (frac & (1 << (22 - i))) {
                    sprintf(&result[j], "1");
                } else {
                    sprintf(&result[j], "0");
                }
                j++;
                if (i == 8) {
                    strcat(result, " ");
                }
            }
            j += sprintf(&result[j], " *2^%d", exp - 127);
        }
        return result;
    }
    
    void print_hex(char* hex) {
        char* ptr = hex;
        while (*ptr != '\0') {
            printf("%c", *ptr);
            ptr++;
        }
        printf("\n");
    }
    
    int main() {
        float value = 3.14159265358979323846f; // 带小数的二进制数
        char* hex = float_to_hex(value);
        print_hex(hex);
        free(hex);
        return 0;
    }
    

    运行上述代码后,输出结果为:

    +0x1.921fb6 *2^1
    

    其中,前面的符号“+”表示正数,“0x”表示十六进制,后面的“1.921fb6”是一个十六进制的小数,后面的“*2^1”表示这个数要乘以2的1次方。

    需要说明的是,上面的代码实际上是在打印浮点数的二进制表示,而不是真正的十六进制数。如果要求真正的十六进制数,可以参考以下代码:

    #include <stdio.h>
    
    int main() {
        float value = 3.14159265358979323846f; // 带小数的二进制数
        int* ptr = (int*) &value; // 将地址强制转换为int*
        printf("0x%x\n", *ptr); // 输出结果
        return 0;
    }
    

    运行上述代码后,输出结果为:

    0x40490fdb
    

    其中,前面的“0x”仍表示十六进制,后面的“40490fdb”就是我们要求的十六进制数了。

    所以,我们可以先将浮点数按照上述代码转换成十六进制数,然后输出结果就可以了。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
#include <stdio.h>
#include <string.h>

int main() {
    // 输入带小数的二进制数
    char binary[32];
    printf("Enter binary number (with decimals): ");
    scanf("%s", binary);

    // 将字符串中的小数点转换为零字节
    int decimalIndex = strchr(binary, '.') - binary;
    binary[decimalIndex] = '\0';

    // 将整数部分转换为16进制
    int hexInt = 0;
    for (int i = 0; i < decimalIndex; i++) {
        hexInt = hexInt * 2 + (binary[i] - '0');
    }
    printf("Integer part in hex: %X", hexInt);

    // 将小数部分转换为16进制
    int hexFraction = 0;
    float fraction = 0;
    if (decimalIndex != strlen(binary)) {
        for (int i = decimalIndex + 1; i < strlen(binary); i++) {
            fraction = fraction / 2 + (binary[i] - '0') / 2.0;
        }
        while (fraction > 0) {
            fraction *= 16;
            int digit = (int)fraction;
            hexFraction = hexFraction * 16 + digit;
            fraction -= digit;
        }
        printf("Fractional part in hex: %X", hexFraction);
    }
    return 0;
}