0

ビット演算子は私の得意分野ではありません。ビットシフトを使用するときに明示的なキャストがいつ必要なのか疑問に思っています。

たとえば、 が符号なし整数型 ( など) である場合は常に true であることが保証されi&1 == i%2ていますか? 問題は、 inが暗黙的に width 型にキャストされているかどうかだと思います。icharunsigneduint64_t1i&1sizeof(i)

2 番目の例として、a を実行する場合、最初に、シフトされた結果を格納するのに十分な幅のデータ型にi = 1<<myshift明示的にキャストする必要がありますか?1i = (uint64_t)1<<myshift

myshift署名されていない限り、2 番目の例の型は無関係ですか?


これらに対する答えは、イエス、イエス、そしてイエスだと思います。特に 2 番目の例はすぐに確認できます。しかし、誰かがこのことについての良い参照を持っていますか? C標準へのリンク/引用は非常に役立ちます。

4

1 に答える 1

2

1 はい。奇数ビットは最下位ビットです。どの表現を選択しても、'1' でオンになります。

標準に従って:

制約

2 各オペランドは整数型でなければなりません。

セマンティクス

3 通常の算術変換がオペランドに対して実行されます。

4 二項 & 演算子の結果は、オペランドのビットごとの AND です (つまり、結果の各ビットは、変換されたオペランドの対応する各ビットが設定されている場合にのみ設定されます)。

sizeof(int)2 はい、バイト (おそらく 4)以上が必要な場合は、これを行う必要があります。

3 はい。再び標準:

制約

2 各オペランドは整数型でなければなりません。

セマンティクス

3 各オペランドで整数昇格が実行されます。結果の型は、昇格された左オペランドの型です。右オペランドの値が負の値であるか、プロモートされた左オペランドの幅以上である場合、動作は未定義です。

4 E1 << E2 の結果は、E1 を左にシフトした E2 ビット位置です。空いたビットはゼロで埋められます。E1 が unsigned 型の場合、結果の値は E1*2^E2 となり、結果の型で表現可能な最大値より 1 を法として少なくなります。E1 に符号付きの型と非負の値があり、E1*2^E2 が結果の型で表現できる場合、それが結果の値です。それ以外の場合、動作は未定義です。

于 2013-05-24T02:46:41.050 に答える