logo

Cの2の補数とは何ですか?

C の 2 の補数は、C の 1 の補数から生成されます。ご存知のとおり、2 進数の 1 の補数は、ビット 1 を 0 に、0 を 1 に変換することによって作成されます。 2 進数の 2 の補数は、2 進数の 1 の補数に 1 を加算することによって生成されます。

つまり、C の 2 の補数は、C の 1 の補数と 1 の和として定義されると言えます。

C の 2 の補数

上の図では、2 進数は 00010100 に等しく、その 1 の補数はビット 1 から 0、0 から 1 を逆に変換することによって計算されます。したがって、1の補数は11101011になります。1の補数を計算した後、1の補数に1を加えて2の補数を計算し、その結果は11101100となります。

2の補数のプログラムを作ってみましょう。

 #include int main() { int n; // variable declaration printf('Enter the number of bits do you want to enter :'); scanf('%d',&n); char binary[n+1]; // binary array declaration; char onescomplement[n+1]; // onescomplement array declaration char twoscomplement[n+1]; // twoscomplement array declaration int carry=1; // variable initialization printf('
Enter the binary number : '); scanf('%s', binary); printf('%s', binary); printf('
The ones complement of the binary number is :&apos;); // Finding onescomplement in C for(int i=0;i<n;i++) { if(binary[i]="=&apos;0&apos;)" onescomplement[i]="1" ; else } onescomplement[n]="" printf('%s',onescomplement); printf('
the twos complement of a binary number is : '); finding twoscomplement in c for(int i="n-1;">=0; i--) { if(onescomplement[i] == &apos;1&apos; &amp;&amp; carry == 1) { twoscomplement[i] = &apos;0&apos;; } else if(onescomplement[i] == &apos;0&apos; &amp;&amp; carry == 1) { twoscomplement[i] = &apos;1&apos;; carry = 0; } else { twoscomplement[i] = onescomplement[i]; } } twoscomplement[n]=&apos;&apos;; printf(&apos;%s&apos;,twoscomplement); return 0; } </n;i++)>

出力

C の 2 の補数

上記のプログラムを解析すると、

  • まず、ビット数を入力すると、それが「」に保存されます。 n ' 変数。
  • ビット数を入力した後、文字配列を宣言します。つまり、 文字バイナリ[n+1]、 2進数を保持します。 ' n ' は、前のステップで入力したビット数です。基本的には配列のサイズを定義します。
  • さらに 2 つの配列を宣言します。つまり、 1 の補数[n+1] 、 そして 2 の補数[n+1]。1 の補数[n+1] 配列は 2 進数の 1 の補数を保持しますが、 2 の補数[n+1] 配列は 2 進数の 2 の補数を保持します。
  • を初期化します 運ぶ 変数を作成し、この変数に 1 つの値を割り当てます。
  • 宣言後、2進数を入力します。
  • ここでは、単純に 2 進数の 1 の補数を計算します。これを行うには、 ループ バイナリ配列全体で反復されます。 for(int i=0;i。 for ループでは、ビットが 1 であるか 0 であるか条件がチェックされます。ビットが 1 の場合は、 1 つの補数 [i]=0 それ以外 1 つの補数 [i]=1 。このようにして、2 進数の 1 の補数が生成されます。
  • 1 の補数を計算した後、2 進数の 2 の補数を生成します。これを行うには、 ループ 最後の要素から開始要素まで反復されます。 for ループには 3 つの条件があります。
    • onescomplement[i] のビットが 1 で、キャリーの値が 1 の場合、twocomplement[i] に 0 を入れます。
    • onescomplement[i] のビットが 0 で、キャリーの値が 1 の場合、twoscomplement[i] に 1 を、キャリーに 0 を入れます。
    • 上記 2 つの条件が false の場合、onescomplement[i] は twoscomplement[i] と等しくなります。

符号付き整数 を使用して C で表現されることがよくあります。 2の補数表記 。同じものを使用する バイナリ表現 両方を表現するメカニズムを提供します ポジティブ そして 負の整数 。の 最上位ビット (MSB) として使用されます 符号ビット 2の補数表現 、 どこ 0 を示します 正の整数 、 そして 1 を示します 負の数

から始まる 負の数の バイナリ形式の絶対値の場合は、 1 の補数 (ビットごとの否定) その値を取得するには 2の補数 の表現 負の整数 。あなたが追加します 1 結果の値 の表現を取得する 2の補数

2の補数エンコーディング C では次のように表すことができます 符号付き整数 高速な算術演算を実行できます。 2 の補数を使用する利点の 1 つは、次のことができることです。 追加 そして 引き算 符号なし数値の場合と同じ二項演算を使用します。

2進数 のように一緒に追加されます 符号なし整数 2の補数を加えるとき。の場所からの搬出 メインクリティカルビット 無視されるだけです。このことから、取り扱いについては、 符号付きの数字 別途追加が必要なくなり追加が簡単になります。

追加を検討してください -5 そして -3 を使用して 8ビットの2の補数 たとえば次のような表現です。

の二進数 -5 11111011。

の二進数 -3 11111101

追加を実行します:

 11111011 (-5) + 11111101 (-3) ------------- 111110100 (-8) 

答えは 111110100 2の補数 に等しい -8

加算と同様に、減算も次のように処理することで実行できます。 第 2 オペランドの あたかも足し算であるかのように 2 の補数を計算します。つまり、負の数の 2 の補数を最初のオペランドに追加して削除します。

たとえば、次のようなとき -3 から減算されます -5 :

バイナリでは、 -5 で表されます 11111011 そして -(-3) による 00000011 (の 2 の補数 -3 )

引き算を実行する

 11111011 (-5) + 00000011 (+3) ------------- 11111110 (-8) 

結果は 11111110 、2の補数では次と等しい -8

結論:

Cでは、 2の補数 に 1 を加算することによって作成される負の数の 2 進数表現です。 1の補数 。コンピュータ システムは、符号付きの数値を表現し、算術演算を効率的に実行するために、この考え方を頻繁に採用しています。

を入手するには、 2の補数 2 進整数の場合、最初に次の値を決定する必要があります。 1の補数 ビットを反転して数値を計算します。その後の表現は、 2の補数 によって得られます 1つ追加する 1の補数 。の 最上位ビット (MSB) 数値が以下であるかどうかを表現することにより、符号ビットとして機能します。 ポジティブ または ネガティブ

の計算 2の補数 特定の 2 進整数については、添付の C プログラムに示されています。ユーザーは両方の入力を求められます。 2進数 そしてビット数。その後、プログラムは 1 の補数を取得するために必要な手順を実行し、 2の補数 。その後、結果が表示されます。

コンピューター サイエンスとプログラミングでは、次のことを理解することが重要です。 2の補数 これにより、バイナリで表現された負の値を効果的に処理できるようになります。させる 足し算、引き算 、 そして 論理演算 両方ともよりシンプル ポジティブ そして 負の数 。の範囲 表現可能な整数 について対称です ゼロ による 2の補数 表現できるため、さまざまな数値演算に適しています。

プログラマーは、2 の補数の概念を理解し、それを適切に利用することで、C やその他のプログラミング言語で算術演算を実行し、バイナリ データを操作し、符号付き整数を使用するアルゴリズムを設計できます。