我试图将一个负的十进制数转换为二进制数,并且此代码在我的计算机上可以正常使用,但是该代码在另一台计算机上不起作用。

我不知道怎么可能。我的代码有什么问题?

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

void decTobin(int dec, int s)
{
    int b[s], i = 0;

     while (dec >= 0 && i != s - 1) {
         b[i] = dec % 2;
         i++;
         dec /= 2;
     }

     int j = i;

     printf("%d", dec);

     for (j = i - 1; j >= 0; j--) {
         if (b[j] == NULL)
             b[j] = 0;

         printf("%d",b[j]);
     }
}

void ndecTobin(int dec, int s)
{
    int b[s], i = 0, a[s], decimal, decimalvalue = 0, g;

    while (dec >= 0 && i != s-1) {
        b[i] = dec % 2;
        i++;
        dec /= 2;
    }

    int j = i;

    printf("%d",dec);

    for (j = i - 1; j >= 0; j--) {
        if (b[j] == NULL)
            b[j] = 0;

        printf("%d",b[j]);
    }

    printf("\n");

    a[s - 1] = dec;

    for (j = s - 2; j >= 0; j--) {
        a[j] = b[j];
    }

    for (j = s - 1; j >= 0; j--) {
        if (a[j] == 0)
            a[j] = 1;
        else
            a[j] = 0;

        printf("%d",a[j]);
    }

    for (g = 0; g < s; g++) {
        decimalvalue = pow(2, g) * a[g];
        decimal += decimalvalue;
    }

    decimal = decimal + 1;
    printf("\n%d\n", decimal);
    decTobin(decimal, s);
}

int main()
{
    int a, b;

    printf("enter a number: ");
    scanf(" %d", &a);
    printf("enter the base: ");
    scanf("%d", &b);

    ndecTobin(a, b);
}

最佳答案

decimalint b[s]未初始化。

如果不将decimal初始化为0,则一天中在一台计算机上它的值可能为0,否则结果完全不同。

void decTobin(int dec, int s) {
  //  while loop does not set all `b`,but following for loop uses all `b`
  // int b[s], i = 0;
  int b[s] = { 0 }; // or int b[s]; memset(b, 0, sizeof b);
  int i = 0;
}

void ndecTobin(int dec, int s) {
  int b[s], i = 0, a[s], decimal, decimalvalue = 0, g;
  decimal = 0;
  ...
  decimal += decimalvalue;
}




次要点:

1)if (b[j] == NULL) b[j] = 0;很奇怪。 NULL最好用作指针,但是代码正在将b[j]int与指针进行比较。此外,由于NULL通常具有算术值0,因此代码看起来像if (b[j] == 0) b[j] = 0;

2)decTobin()具有挑战性。当然,它仅适用于非负decs。候选人简化:

void decTobin(unsigned number, unsigned width) {
  int digit[width];
  for (unsigned i = width; i-- > 0; ) {
    digit[i] = number % 2;
    number /= 2;
  }

  printf("%u ", number);  // assume this is for debug

  for (unsigned i = 0; i<width; i++) {
    printf("%u", digit[i]);
  }
}

关于c - 将负十进制数转换为二进制数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27460677/

10-12 06:20