为什么我的程序无法将十进制数转换为二进制数?

时间:2018-10-04 06:10:57

标签: c binary

我正在尝试使用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而不是11111111

2 个答案:

答案 0 :(得分:2)

这根本没有道理:

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中声明该数组并将地址传递给该函数,然后您就可以对其进行写操作,甚至不必返回任何内容。

答案 1 :(得分:1)

关于版本1:

内循环结束时,k始终为0。

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

这意味着在嵌套循环之后,每个bits[j]都将保留originalBits[0]的值。

解决方案:

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

关于版本2:

您从k=32开始,并在每次迭代中使用之后递减:

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

这意味着您将在数组中以originalBits[32] ... originalBits[1]结尾。 这是超出范围的访问,并且也缺少最后一个元素。

解决方案是这样的:

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

作为一般提示: 使用调试器可以很容易地发现这种类型的错误。逐步执行循环,观察索引变量,对其进行修复。

有关返回指向非静态数组的指针的更新:

int* showbits(int decNum)
{
  int bits[32];
  ...
  return bits;
}

在离开该功能后,bits将变为无效。这会使指针无效。

您可以通过不同的方式解决此问题:

如果在使用数组之前没有同时从多个线程或多个值中调用函数:

int* showbits(int decNum)
{
  static int bits[32];
  ...
  return bits;
}

现在数组将保持有效,您的指针也将保持有效。如果再次调用该函数,则会使用相同的数组,从而更改以前的调用中的位。

如果您需要其他缓冲区:

int* showbits(int decNum)
{
  int *bits = malloc(sizeof(*bits)*32);
  ...
  return bits;
}

然后,您需要在调用函数中free之后使用指针。