2017-01-02 34 views
0

(1u << x << y)はどういう意味ですか?私は問題を抱えている

1U << 0 = 1 

1U << 1 = 2 

1U << 2 = 4 

等...オーケー..

例えば

1u<<1<<2 

私にこのことを教えてもらえますか? Biwiseシフト
2を左:連想式で等しい優先順位の演算子が何であるかを順に示す<< として

+0

*試してみませんか?結果を出力する小さなプログラムを作る。 –

+0

私はそれを試しました#define LED_RED(1U << 1).......... *((符号なし整数揮発性*)(0x40025000 +(LED_BLUE << 2))= LED_BLUE;しかし、理解していません – aytac

+0

[質問]と[mcve]を提供します。**具体的には、 '<<"演算子の簡単な検索で見つかるさまざまなページの説明については不明ですか? ? – Olaf

答えて

1

これは 1U<<1<<2 = 2<<2 = 8U

左結合であります適用される。
注:理論1U<<x演算子の優先順位ルールがどのようにCの発現を指示1<<x

+0

修正: '32'ではなく、' 32U'です! – Olaf

+0

はい、それは8U @Olaf – coderredoc

+0

です。そういうわけで、私はそのような式のためにカッコとスペースを使用していますが、それでも正しい言葉の署名が得られるはずです – Olaf

0

よりポータブルになるように署名された引数にビットシフト演算の結果は、実装定義結果を与えます同じ行の複数のオペランドが解析されます。これはC言語の泥だらけの部分なので、operator precedence tableは理解のための便利なツールです。

は、この場合、同じ優先順位を有する2つの<<演算子があるので、オペランドのグループのオペレータ連想は、次いで、発現の解析方法を指示します。これは、シフト演算子の場合は左から右になります。つまり、式が(1u<<1)<<2として解析されることが保証されています。言い換えれば

、それは書き込み1u << 3とまったく同じものです。

1整数定数は、符号なしのタイプであることuサフィックスを保証します。私達はちょうど1を入力した、1定数この整数はsignedあるタイプintであろう。なぜなら、符号付き整数型のシフト操作を実行すると、あらゆる種類の未定義の動作(バグ)が発生する可能性があるため、常に回避する必要があるからです。たとえば、1 << 31は32ビットシステムでは深刻なバグですが、1u << 31は完全に安全で安全です。

+0

ありがとうLundin、それは有用な答えです.. – aytac