bugfix> c++ > 投稿

これは例です「C ++プログラミングの完全ガイド」(Ulla Kirch-Prinz&Peter Prinz)

例:

cout << dec << -1 << " " << hex << -1;

このステートメントにより、32ビットシステムで次の出力が生成されます。

-1 ffffffff

誰も2番目の出力が ffffffff である理由を説明してください ?

私は言う本の説明に問題があります:

When octal or hexadecimal numbers are output, the bits of the number to be output are always interpreted as unsigned! In other words, the output shows the bit pattern of a number in octal or hexadecimal format.

回答 3 件
  • これは、最新のマシンのほとんどが2の補数の符号付き整数表現を使用しているためです。

    2の補数では、最上位ビットが符号ビットとして使用されます。設定されている場合、数値は負と見なされ、その絶対(正)値を取得するには、2から減算する必要がありますN、つまり、2の補数を取る。

    8ビットの数値00000001がある場合、2の補数は100000000-00000001 = 11111111(または0xFF hex)になります。したがって、-1はすべて1としてバイナリ形式で表されます。

    数値が符号なしであるように演算を実行して(オーバーフローさせ)、結果を符号付きとして解釈するだけで、正しい結果が得られるため、非常に便利なシステムです。

  • コンパイラは、次の方法で符号付き変数に負の数値を実装します。最上位ビットがtrueの場合、数値は(VALUE_RANGE-variable)のように実装されます

    8ビットの数値の例を次に示します。拡張してください。

    char   0 1 2 ... 10 ... 126 127 -128 -127 -126 ... -10 ...  -2   -1
    uchar  0 1 2 ... 10 ... 126 127  128  129  130 ... 246 ... 254  255
    hex    0 1 2 ... A  ...  7E  7F   80   81   82 ...  F6 ...  FE   FF   
    
    

  • 強調表示したテキストは、出力が次と同等であることを示しています

    cout << dec << -1 << " " << hex << (unsigned)-1;
    
    

    2の補数システム(最近ではデスクトップPC)で、 -1 のビットパターン  すべてのビットが1に設定されています。

    32ビット int の場合  したがって、出力は ffffffff になります 。

    最後に、もし int  (したがって、 unsigned )は32ビットで、タイプ リテラル 0xffffffff の  は unsigned です 。


    参照:

    http://en.cppreference.com/w/cpp/language/integer_literal

    https://en.wikipedia.org/wiki/Two%27s_complement

あなたの答え