2017-03-16 121 views
1

所以有這樣的代碼如何將十進制轉換爲二進制的64位?

int main() 
{ 
    int n, c, k; 

    printf("Enter an integer\n"); 
    scanf("%d", &n); 

    printf("%d in binary is:\n", n); 

    for (c = 31; c >= 0; c--) 
    { 
    k = n >> c; 

    if (k & 1) 
     printf("1"); 
    else 
     printf("0"); 
    } 

    printf("\n"); 

    return 0; 

} 

它轉換成十進制二進制但僅在32位。當我將它改爲64位時,它不起作用(它似乎只是32位結果的兩倍)。同時它可以正常工作8或4位等。 我做錯了什麼?

+1

你是如何轉換爲64位? 'c = 63'? – AntonH

+1

@AntonH:除非'int'是64位,否則調用未定義的行爲。 – Olaf

+1

使用''和固定大小類型。 –

回答

2

它將十進制轉換爲二進制,但只有32位。當我將它改爲64位時,它不起作用(它似乎只是32位結果的兩倍)。

問題就在這裏。

int n, c, k; 

    printf("Enter an integer\n"); 
    scanf("%d", &n); 

nint其可以是作爲16位的小。它可能是64位,但可能是32位。當你嘗試輸入64位數字時,你會得到垃圾。

#include <stdio.h> 

int main() { 
    int n; 

    printf("sizeof(int) == %zu\n", sizeof(int)); 

    printf("Enter an integer\n"); 
    scanf("%d", &n); 

    printf("n = %d\n", n); 
} 

$ ./test 
sizeof(int) == 4 
Enter an integer 
12345678901 
n = -539222987 

相反,可以使用一個long long int它具有64位或從stdint.h這正是64位int64_t的最小尺寸。我傾向於在代碼中使用顯式寬度類型,這需要特定的寬度才能使讀者更加明白。

long long int使用%lldscanfprintfint64_t使用macros from inttypes.h。下面的代碼利用C自動連接常量字符串; "foo" "bar""foobar"是等同的。

#include <stdio.h> 
#include <stdint.h> 
#include <inttypes.h> 

int main() { 
    int64_t n; 

    printf("Enter an integer\n"); 

    scanf("%"SCNd64, &n); 

    printf("n = %"PRId64"\n", n); 
} 


$ ./test 
Enter an integer 
12345678901 
n = 12345678901 
+1

'%lld'不一定是固定寬度類型的正確轉換類型說明符。使用'inttypes.h'中的宏。順便說一句。一些實現具有固定寬度類型名稱的內置類型('stdint.h'只是'typedefs'這些內置名稱的標準名稱),因此它們明顯不同於標準類型。 – Olaf

+0

@Olaf謝謝!我會解決這個問題。 – Schwern

0

問題是您的變量的數據類型。它們是整數。使用sizeof(int)檢查您的平臺的數據類型大小。

當您更改爲64位時,這些變量不能保存64位值。

HTH!

0

下面的代碼是處理問題的一種方法:

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

int main(void) 
{ 
    long long unsigned int n; 
    long long   int c; 
    long long unsigned int k; 

    printf("Enter an integer\n"); 
    if(1 != scanf("%llu", &n)) 
    { 
     perror("scanf for 64 bit number failed"); 
     exit(EXIT_FAILURE); 
    } 

    // implied else, scanf successful 

    printf("%llu in binary is:\n", n); 

    for (c = 63; c >= 0; c--) 
    { 
     k = n >> c; 

     if (k & 1) 
      putc('1', stdout); 
     else 
      putc('0', stdout); 
    } 

    printf("\n"); 

    return 0; 
} // end function: main 

,這裏是從程序的典型運行輸出:

Enter an integer 
6789097860397846 
6789097860397846 in binary is: 
0000000000011000000111101010011000000110010100000111101100010110 
+0

注意:以上是在ubuntu linux 16.04上運行gcc用來編譯和鏈接的。 – user3629249

相關問題