2016-11-16 19 views
1

には何の影響もありません。私はthis answerに似たようなものがあると思っていましたが、その場合は式の結果を変数に代入していませんでした。私の場合、私はそれを割り当てていますが、表現のビットシフト部分は効果がありません。割り当て時のビットシフトは変数

unsigned leftmost1 = ((~0)>>20); 
printf("leftmost1 %u\n", leftmost1); 

戻り

leftmost1 4294967295 

unsigned leftmost1 = ~0; 
leftmost1 = leftmost1 >> 20; 
printf("leftmost1 %u\n", leftmost1); 

は私に

leftmost1 4095 

私は何の影響も及ぼさない2行にロジックを分離する期待を与えるのに対し、なぜ結果があります違う?

+0

@ M.M編集の簡潔さ – mickadoo

+0

あなたの実装は、 '1'ビットをすでにすべてのビットが' 1'に設定されている符号付きの値にシフトしています。だから変化はありません。 '(~0u)>> 20' –

答えて

6

をシフトするとき、あなたは符号付き右シフトを行っている符号ビットを運んでいますので、署名されている intに昇格です。署名された右シフトの正確な振る舞いは実装定義されていますが、あなたを含むほとんどのプラットフォームは符号ビットを拡張しているので、シフトは "すべてのもの"の入力に対しては何もしません。

leftmost1unsignedなので、2番目のケースでは、符号なし右シフトが実行されます。左からゼロにシフトします。

あなたは中間assignmetnなし符号なしシフトをやってみたかった場合、あなたが行うことができます:

(~0u) >> 20 

uサフィックスは符号なしのリテラルを示しています。

+0

十分に公正であるが、言語弁護士の外ではそれらは反対ではない。私は "標準によって不特定"を意味しました。 – BeeOnRope

+3

標準で指定されており、実装がその選択を文書化する必要があることを指定します。これは、その動作が効果的にランダムである可能性があるということとは重要な違いです。 –

+0

正しい場合でも、あなたは賢明である:私の指摘は、標準が_正確な動作を指定していないことであり、_specify_を実装する必要があるということです。たぶんあなたはそれを "指定された振る舞い"と呼んでいますが、それはちょうどセマンティクスです - 私には、 "標準では指定されていません"と言うのは正しいです。はい、これは_UB_や標準で言及されていないものとは異なることを理解しています。 – BeeOnRope

2

このようにキャストしてみてください。 〜0は、符号付きの値で~0結果ので、それは、あなたが最初のケースで

unsigned leftmost1 = ((unsigned)(~0)>>20); 
printf("leftmost1 %u\n", leftmost1); 
+0

'〜0'と '0'の前にあまりに多くの回答が既にint型であり、宣伝は行われません。あなたのバージョンが完全に正しくない、キャストはbitwiseの前に行われるべきです。 – 2501

+0

@ 2501それは問題を引き起こしているシフト操作です。私のバージョンでは、符号なしまたは論理右シフトが発生します。 – cleblanc

+0

あなたの答えは〜0がintに昇格されているが、0の型はすでにint型であるため正しくないと言います。 – 2501

2

0は、タイプintである。 ~0は、典型的な2の補数マシンで-1です。負の数を右シフトすると実装定義の結果が得られますが、-1の場合はが再び-1になります。-1の場合は、1ビットでシフトするのが一般的です。

0u(リテラルはunsigned int)と書いてください。この行はunsigned leftmost1 = -1と同等です

unsigned leftmost1 = ~0; 

、暗黙的に変換する-1(符号付き整数)UINT_MAXに:これがあなたの第二の例のように、操作がunsigned intに行われるように強制します。次の操作(leftmost1 >> 20)は、符号なし演算を使用します。

3

~0は、intです。だから、コードのあなたの最初の部分が第二と等価ではない、それはあなたが負の数を右にシフトするときには、符号拡張の結果を見ている

int tmp = ~0; 
tmp = tmp >> 20; 
unsigned leftmost1 = tmp; 

に相当します。

関連する問題