2017-04-15 8 views
0

これは純粋に学術的ですが、私はCで、単純な真理値表を作成しました:C否定演算子プリント予期しない結果

#include <stdio.h> 

int main() { 
    for(int j=0; j<=2; j++) { 
    int bitB = (j&1); 
    printf("~%d = %d\n", bitB, ~bitB); 
    } 
    return 0; 
} 

は、端末収率で実行:GDBで

~1 = -2 
~0 = -1 

デバッグprintfに改行を設定すると、私が期待しているものが得られます。

(gdb) print bitB 
$5 = 1 
(gdb) cont 
Continuing. 
~1 = -2 
(gdb) x/xw &bitB 
0xbffff3d8: 0x00000000 

なぜプログラムがアウトプットですかtは負の数を示しますか?

+0

[mcve]を入力してください。表示されたコードはこの出力を生成しません。そしてその質問は意味をなさない。あなたはリンゴとオレンジを比較しますか? 'x/xw'は出力が異なる全く異なるコマンドです。なぜあなたのコードのように 'p〜bitb'をしないのですか? – Olaf

+0

2の補数と負の整数の表現方法を調べます。2の補数のために調整 – kaylum

+0

: の#include のint main()のための{ (int型J = 0であり、j <= 1; J ++){ unsigned int型BITB =(J &1); のprintf( "〜%のD = %u \ n "、bitB、〜(bitB - 2); } return 0; } –

答えて

3

これは、少なくとも負の数は、two's complement systemで表されているシステムでは、完全に予想される結果である:

  • 負つ1に設定されたすべてのビットで表現され、そして
  • マイナス2
  • が設定されているすべてのビットを有します最後のビットを除いて 1になります。したがって

、ゼロのすべてのビットを反転させること-1をもたらし、そして1利回り-2の全ビット反転する:あなたは、すべてのビットを反転2の補数表現で数値の符号を反転するために、数学的に

0000000000000000 -> 1111111111111111 // Zero becomes negative 1 
0000000000000001 -> 1111111111111110 // One becomes negative 2 

を番号を入力し、1を結果に追加します。 xのすべてのビットを反転するだけで、-x-1が得られます。これはまさにあなたが見る結果です。

なぜ出力に負の数が表示されますか?あなたは%d書式指定、およびあなたが負の数の表現に起こる印刷ビットパターンでintを締結し使用しているため

+0

ありがとう、ありがとう。 –

-1

あなたがタイプint(その記号を含む)、及び最上位ビットもTwo's complement規則に従って符号を変える反転を使用しているため(~反転は/すべてのビットを補完することに注意してください)。

~があなたに符号なしの表現を与えると思われる場合は、おそらくunsigned int(および%u)を使用します。

0

すべてのシステムおよび番号の表現で、これは負の数を与えます。符号ビットを含むすべてのビットを補完しています。

関連する問題