2014-12-13 25 views
-1

,我打算給負十進制數轉換成二進制數這個代碼完美的作品在我的電腦上,但代碼不工作的另一臺計算機。轉換負十進制數二進制數

我沒有得到它是如何可能的。我的代碼有什麼問題?

#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); 
} 
+2

我希望你知道什麼'「有意義的名字」'意思?! – Rizier123 2014-12-13 15:51:28

+2

我爲您格式化了源代碼。請嘗試在下次發佈格式化的源代碼時,很難回答在屏幕上看起來像有人吐出的問題。 – fuz 2014-12-13 16:04:07

+0

對不起,謝謝。 – bendensin 2014-12-13 16:06:03

回答

3

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]); 
    } 
} 
1

看起來你只是把數字打印成二進制表示。如果是的話,這個版本可以工作

void print_binary(size_t n) { 
    /* buffer large enough to hold number to print */ 
    unsigned buf[CHAR_BIT * sizeof n] = {0}; 
    unsigned i = 0; 

    /* handle special case user calls with n = 0 */ 
    if(n == 0) { 
     puts("0"); 
     return; 
    } 
    while(n) { 
     buf[i++] = n % 2; 
     n/= 2; 
    } 

    /* print buffer backwards for binary representation */ 
    do { 
    printf("%u", buf[--i]); 
    } while(i != 0); 
} 

如果你不喜歡的緩衝區,你也可以做使用遞歸這個樣子:

void using_recursion(size_t n) 
{ 
    if (n > 1) 
     using_recursion(n/2); 

    printf("%u", n % 2); 
} 

還有一種方法是打印第一評估最顯著位。然而,這引入了在下面的代碼中跳過的前導零的問題。

void print_binary2(size_t n) { 
    /* do not print leading zeros */ 
    int i = (sizeof(n) * 8)-1; 
    while(i >= 0) { 
     if((n >> i) & 1) 
     break; 
     --i; 
    } 

    for(; i >= 0; --i) 
     printf("%u", (n >> i) & 1); 
} 
+0

@chux在case 1)的情況下,while循環結束,所以不會得到buf [-1]。 2)會工作是的。然而,在當前時代通過的int不太可能超過64位。 – 2014-12-13 16:46:55

+0

@chux你說的是一個用戶調用n = 0的函數嗎? – 2014-12-13 16:57:43

0

不同的操作系統/處理器組合可能會導致C編譯器以不同數量的字節存儲各種數字變量。例如,當我第一次學習C(Turbo C在80368,DOS 5上)時,int是兩個字節,但現在,在64位Linux上使用gcc時,我的int顯然是四個字節。您需要包含一些方法來說明變量類型的實際字節長度:一元運算符sizeof(foo)(其中foo是一種類型,在您的情況下,int)返回一個無符號整數值,您可以使用它來確保您執行正確的數字位移。