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

时间:2015-10-09 16:07:46

标签: 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再次运行它。

有人可以告诉我这是什么问题以及需要改变的事情吗?提前谢谢!

2 个答案:

答案 0 :(得分:1)

这是一个适合你的解决方案,当我检查每个字符的输入时,它不会在内部存储很多内容。整体部分很简单,只需建立价值。小数部分有点困难,要正确对齐它我一次输入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

答案 1 :(得分:0)

首先,您需要在循环中将binaryval更改为num