2017-03-16 17 views
1

ので、私はそれがバイナリにのみ32ビットで小数を変換するこのコード10進数を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; 

} 

を有します。 64ビットに変更すると動作しません(32ビットからの結果が2倍になったようです)。それと同時に、それは8または4ビット等でうまく動作します。 私は間違って何をしていますか?

+1

はどのようにして、64ビットに変換していますか? 'c = 63'? – AntonH

+1

@AntonH: 'int'が64ビットでない限り、それは未定義の動作を引き起こします。 – Olaf

+1

は「」と固定サイズの種類を使用します。 –

答えて

2

これは10進数を2進数に変換しますが、32ビットしか変換しません。 64ビットに変更すると動作しません(32ビットからの結果が2倍になったようです)。

ここに問題があります。

int n, c, k; 

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

n 16ビットほど小さくすることができるintあります。それは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 

代わりに、あなたは正確に64ビットですstdint.hから64ビットまたはint64_tの最小サイズを持っているlong long intを使用することができます。私は、明示的な幅の種類を特定の幅を必要とするコードで使用することを優先しています。 int64_tmacros from inttypes.hを使用しながら、

long long intscanfprintfため%lldを使用しています。以下のコードは、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'のマクロを使います。 Btw。実装の中には、固定幅型の名前の組み込み型( 'stdint.h'だけで、これらの組み込み名への標準名である' typedefs')があり、標準型とは明らかに区別されます。 – Olaf

+0

@Olafありがとう!私はそれを修正するでしょう。 – Schwern

0

問題はあなたのn &k変数のデータ型です。それらは整数です。 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

注:上記は、コンパイルとリンクにgccを使用して、ubuntu linux 16.04で実行されました。 – user3629249

関連する問題