为什么我的C二进制到十进制程序不能返回正确的值?

时间:2016-09-23 19:04:02

标签: c return-value

对于大型作业的一部分,我正在编写一个将二进制数转换为小数的程序。我知道我这样做的方式有点奇怪,可能会有所改进,但我喜欢它现在的样子,它几乎可以工作。唯一的问题是如果你把它作为你的二进制数字10,它返回1,但它应该返回2.我测试的所有其他数字正常工作。这是代码的相关部分:

int countDigits (int num) {
    int digits = 0;
    while (num != 0) {
        num /=10;
        digits++;
    }
    return digits;
}

long int binToDec (int num) {
    int numDigits = countDigits(num);
    char temp[32];
    int numStore[32];
    long int sum = 0;
    snprintf(temp, 32, "%d", num);
    for (int i = 0; i < numDigits; i++) {
        numStore[i] = temp[i] - '0';
    }
    for (int i = 0; i < numDigits; i++) {
        if (numStore[i] == 1) {
            sum += pow(2, i);
        }
    }
    printf("%ld\n", sum);
    return sum;

}

int main(void) {
    binToDec(10);
    return 0;
}

我绝对无法弄清楚为什么它没有返回正确的值。起初我以为我是以错误的顺序迭代,但除非我做错了,否则计算我而不是向上产生相同的输出。有人可以指出我的错误吗?

1 个答案:

答案 0 :(得分:1)

我喜欢毫无意义但又有趣的十进制编码二进制(DCB)表示,但是你可以设计这个。考虑使用countDigits()函数中的逻辑作为binToDec()的基础,您可以获得更简单的内容:

#include <stdio.h>
#include <math.h>

unsigned int binToDec(unsigned long number) {
    unsigned int sum = 0;

    for (unsigned int i = 0; number > 0; i++, number /= 10) {
        if (number % 2 != 0) {
            sum += pow(2, i);
        }
    }

    return sum;
}

int main(void) {

    printf("%u\n", binToDec(101010));

    return 0;
}

<强>输出

> ./a.out
42
> dc
2 i
101010 p
42
>

并且输入10会为您提供2的输出。