c - 二进制小数到十六进制的错误 (turbo c)

标签 c binary hex

我刚刚修改了此代码以接受带有小数部分的二进制数。代码如下:

#include <stdio.h>

int main()
{
    double binaryval, frac, z;
    long int hexadecimalval = 0, i = 1, remainder, num, p;
    clrscr();
    printf("Enter the binary number: ");
    scanf("%lf", &binaryval);
    num = binaryval;
    frac = binaryval - num;
    while (binaryval != 0)
    {
        remainder = num % 10;
        hexadecimalval = hexadecimalval + remainder * i;
        i = i * 2;
        binaryval = binaryval / 10;
    }
    printf("Equivalent hexadecimal value: %lX", hexadecimalval);
    printf(".");
    while (binaryval != 0)
    {
        while(frac != 0)
        {
            z = frac * 2;
            p = z;
            frac = z - p;
        }
        remainder = p % 10;
        hexadecimalval = hexadecimalval + remainder * i;
        i = i * 2;
        binaryval = binaryval / 10;
    }
    printf("%lX", hexadecimalval);
    getch();
    return 0;
}

所以问题是......它给出了一个完全错误的答案

示例输出:
输入二进制数:1111.1111
等效的十六进制值:FFFFFFFF.FFFFFFFF

然后我尝试在此循环中将 'binaryval' 更改为 'num'...

while (num != 0)
{
    remainder = num % 10;
    hexadecimalval = hexadecimalval + remainder * i;
    i = i * 2;
    binaryval = num / 10;
}

但它只允许用户输入二进制数而没有其他内容。另外,我什至无法返回我的代码。它有点“卡住”,我必须关闭我的 Turbo C 才能再次运行它。

有人可以告诉我问题是什么以及需要更改的内容吗?提前致谢!

最佳答案

这是为您提供的解决方案,当我检查每个字符的输入时,它不会在内部存储太多内容。不可或缺的部分很简单,只需构建值(value)即可。小数部分有点困难,为了正确对齐它,我一次输入 4 位。

#include <stdio.h>
#include <ctype.h>

int main(void)
{
    long whole=0;
    int ch, fract=0, bits=0;

    // integral part is straight fowrard
    while ((ch=getchar()) != EOF && ch != '.' && ch != '\n') {
        switch(ch) {
            case '0':
                whole = whole * 2;
                break;
            case '1':
                whole = whole * 2 + 1;
                break;
            default:
                printf("Bad input\n");
                return 1;
        }
    }
    printf("%lX", whole);

    // fractional part is more tricky to align correctly
    if (ch == '.') {
        printf(".");
        while ((ch=getchar()) != EOF && ch != '\n') {
            switch(ch) {
                case '0':
                    fract = fract * 2;
                    bits++;
                    break;
                case '1':
                    fract = fract * 2 + 1;
                    bits++;
                    break;
                default:
                    printf("Bad input\n");
                    return 1;
            }
            if (bits == 4) {            // process 4 bits at a time
                printf("%X", fract);
                fract = 0;
                bits  = 0;
            }
        }
        if(bits) {                          // deal with 1 to 3 trailing bits
            printf("%X\n", fract << (4-bits));
        }
    }
    printf("\n");
    return 0;
}

您的示例输入和另一个:

1111.1111
F.F

1.000001
1.04

关于c - 二进制小数到十六进制的错误 (turbo c),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33042753/

相关文章:

c# - 将十六进制字符串转换为二进制字符串

c++ - 是否有可能不让我的可执行文件中的符号可用于动态打开的库?

c - 在 Linux 上嗅探数据包时过滤网络堆栈中的数据包?

oracle - 为什么 (a | b ) 等于 a - (a & b) + b?

java - 二进制转十六进制和十六进制转二进制

java - 将字符串转换为十六进制值的字节数组

c、大端系统中的十六进制表示

javascript - 将八进制和十六进制数转换为基数 10

c - 用字符串替换字符

c 释放 malloc(0)