2012-03-03 20 views
3

私は、次のコードを得た:-64Cの右シフト演算子?

int main(int argc, char *argv[]) 
{ 
    char c = 128; 

    c = c >> 1; 

    printf("c = %d\n", c); 

    return 0; 
} 

は勝利XPの32ビットに上記のコードを実行し、私は結果を得ました。なぜ-64ですか?

+3

ヒント: 'char c = 128;行の後に' printf( "シフトc =%d \ n"、c); '行を追加します。 –

答えて

8

タイプが符号付き8ビット整数(使用しているCの実装では)であるため、charタイプです。値128を格納しようとすると、実際には-128になります。そのため

ビットは次のようになります。結果は-64

11000000 

負の数をシフト
10000000 

符号ビットセットを(あなたの実装では算術シフトを使用するように)維持します。

+3

+1。しかし、その特定のプラットフォームで** charが署名されていることを明確にする必要があります**。また、標準で負の値を右シフトするための特定の動作が指定されていないことを明確にする必要があります。 –

+0

@OliCharlesworth:はい、そうです。このhttp://en.wikipedia.org/wiki/C_data_typesとhttp://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2Bには、これに関する標準の内容に関する具体的な情報があります。 – Guffa

0

変数cに署名します。宣言をunsigned char cに変更すると、結果は64となります。

3

C標準では、charが符号付きか符号なしかを指定していません。この場合、-128から+127の範囲で、符号付きcharが得られているように見えます。それに128を割り当てれば、-128となり、C >> 1は-64になります。

あなたは「unsigned char型」としてcを指定するとコメントが言うように、C >> 1は、それが出てくることだけ運ですので、右シフト、負の値は、標準で定義されていない、64

になりますが-64として

+1

最初の部分は+1です。しかし、右シフトの負の値は実装定義であることを明確にすべきです。 –

0

タイプcharを使用していますが、デフォルトで署名されています。符号付きcharの範囲は-128〜127です。つまり、char c = 128は実際にはc〜-128を設定します。 (これは、ほとんどのプロセッサが負の数を表現するために2の補数を使用するためです)したがって、右にシフトすると-64が得られます。

ボトムラインは、ビット操作を行うときに、符号なしの型を使用して期待する結果を得ることです。