2016-11-09 2 views
-1

バイナリのCコードに負の10進数を書き込むことはできません。 は助けが必要です:) ここに私のコードは...... 他には必要ありません。バイナリのCコードに負の10進数を

#include <stdio.h> 

    int main(void){ 
     int i; 
     int j; 
     int b[16]; 
     printf("input number"); 
     scanf("%d",&i); 
     if(i <= 0) { 
      // here is negative decimal code 
     } else { 
      for(j=15;j>=0;j--) { 
       b[j] = i % 2; 
       i = i/2; 
      } 
      for (j=0;j<=15;j++) 
       printf("%d", b[j]); 
      printf("\n"); 
     } 
     return 0; 
    } 
+2

「ここは負の10進コードです」このケースのコードは表示されません。誰かにあなたのためにそれを書いてもらいたいですか? – user463035818

+0

何をしようとしていますか?各intが2進数であるintの配列を構築しますか?それは何のために良いですか?あなたが 'for(uint32_t i = 0; i Lundin

+0

_any_オブジェクトのバイナリエンコーディングを出力するには、[this](http://stackoverflow.com/questions/35364772/how-to-print-memory-bits-in-c/35367414#35367414) – chux

答えて

1

符号付き整数を2進数で出力するには、2で繰り返し除算を実行します。幅が16でも2の補数であると仮定する必要はありません。 >>シフトを使用すると、実装定義の動作が呼び出されます。

#include <stdio.h> 
#include <stdbool.h> 

void print2_helper(int x) { 
    bool isodd = x%2; 
    x /= 2; 
    if (x) print2_helper(x); 
    putchar('0' + isodd); 
} 

void print2(int x) { 
    printf("Decimal:%d\tBinary:", x); 
    if (x < 0) putchar('-'); 
    print2_helper(x); 
    putchar('\n'); 
} 

int main(void){ 
    print2(0); 
    print2(1); 
    print2(-1); 
    print2(2); 
    print2(-2); 
    print2(INT_MAX); 
    print2(INT_MIN); 
    return 0; 
} 

出力。

Decimal:0 Binary:0 
Decimal:1 Binary:1 
Decimal:-1 Binary:-1 
Decimal:2 Binary:10 
Decimal:-2 Binary:-10 
Decimal:2147483647 Binary:1111111111111111111111111111111 
Decimal:-2147483648 Binary:-10000000000000000000000000000000 
2

ちょうどunsignedとして整数、及び出力ビットを表示します。

負の数(通常は2の補数)の内部表現のビットを取得します。負の数を別々に扱う必要はありません。

また、これは多くの初心者にとって理解しにくいようですが、iの数字は「小数」ではありません。 10進数の文字列を読み取ることによって初期化されましたが、基礎となるコンピュータメモリは恐らくバイナリ表現を使用して格納しています。

実際の数は同じである:インスタンス23 = 10111 ための2つのエンティティが同じで、それらが同じであることを意味します。特定のベースで数値を表示しても、数値は変更されません。

1

bitshift演算子を使用してビットを取得できます。

#include <stdio.h> 

    int main(void){ 
     int i   = 0; 
     unsigned int u_i = 0; 
     int j   = 0; 
     int b[16]  = {0}; //Assuming your integer size is 16bit 

     printf("input number"); 
     scanf("%d",&i); 

     u_i = (unsigned int)i; 

     for(j=15;j>=0;j--) { 
      b[j] = u_i & 0x1; 
      u_i = u_i >> 1; 
     } 

     for (j=0;j<=15;j++) 
      printf("%d", b[j]); 

     printf("\n"); 
     return 0; 
    } 
+0

右シフト負の値を持つ16ビット整数は、実装定義の動作をもたらします。[Ref](http://stackoverflow.com/questions/40508958/shifting-a-negative-signed-value-is-undefined/40509322#comment68260203_40508958)コードは行います。これにより、期待される結果が得られる可能性が高くなりますが、Cによって指定されていません。 – chux

+0

@chux、私はその投稿を完全に理解していませんでしたが、私はあなたの意見を理解しています。コードを変更し、シフト操作にunsigned intを使用しました。 – MayurK

関連する問題