我试图用C转换一个十进制数,我的函数正确地执行了第一部分,但没有第二部分。它应该得到数字的剩余部分除以2,将这些数字存储在一个数组中,然后返回数组,但返回的是相反的。我的代码是:

int* showbits(int decNum){
    int originalBits[32];
    int i;
    for(i = 0; i < 32; i++){
        int temp = decNum % 2;
        originalBits[i] = temp;
        decNum = decNum / 2;
    }
        int a;
    for (a = 0; a < 32; a++){
        printf("%d ", originalBits[a]);
    }
    printf("\n");

    int j = 0;
    int k = 32;
    int bits[32];
    for (j = 0; j < 32; j++){
        for (k = 32; k > 0; k--){
            bits[j] = originalBits[k];
        }
    }

    int m;
    for (m = 0; m < 32; m++){
        printf("%d ", bits[m]);
    }

    return bits;
}

如果我给255函数供电,输出将把所有的1都放进去。我还尝试将最后一个循环替换为:
    for (j = 0; j < 32; j++){

            bits[j] = originalBits[k--];

    }

但这漏掉了一个数字,对于255,给出的是1111111而不是1111111

最佳答案

这完全没有道理:

for (j = 0; j < 32; j++)
{
    for (k = 32; k > 0; k--)
    {
        bits[j] = originalBits[k];
    }
}

我想你想在这里崇敬,但想想你在做什么。
使用j的一个循环迭代将originalBits的每个元素写入bits[0]中,然后对bits[1]执行相同的操作并继续。这意味着每一位的值在末尾都有originalBits[0]的值。
这里一个循环就足够了,您只需从数组的另一端开始读取:
for (j = 0; j < 32; j++)
{
    bits[j] = originalBits[31-j];
}

这样,您可以从originalBits的末尾读到前面,然后从bits的前面写到最后。足以逆转内容。
除此之外,不能返回指向函数本地数组的指针。
int bits[32];

当您到达函数的末尾时将无效,但您将其地址传递给调用方。这是不明确的行为,必须避免。
或者创建一个具有静态存储持续时间的数组,例如在文件作用域中将其声明为全局变量。
或者可以使用malloc动态获取内存,
int *bits = malloc(32 * sizeof *bits);

但是你必须确保你也释放了分配的内存。
另一种可能是在main中声明数组并将地址传递给函数,然后就可以对其进行写入,甚至不必返回任何内容。

关于c - 为什么我的程序无法将十进制数转换为二进制数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52640102/

10-12 15:14