5

注:この質問は、ビットシフト演算子<<および>>の第2オペランドの符号に関するものです。最初のオペランドについてはまったくありません。

CERT INT34-C、一部:負のビット数をシフトしないでください..。

それが正当化を必要としたというわけではありませんが、彼らはそれが未定義の振る舞いであると言って正当化します。

他の方向にシフトしたい場合は、他の方向に適切なシフト演算子を使用して正のビット数だけシフトするため、このルールは理にかなっていると思います。

したがって、Cで、負のビット数だけシフトする必要がなく、未定義の場合、<<または>>の第2オペランドに符号を付けることさえ許可されるのはなぜですか?

たとえば、MISRA-C:2004(MISRAが好きか嫌いかは何でも)のセクション6.10.2で、結果のタイプが最初のオペランドのみに依存することを説明する副作用として、「2番目のオペランドはオペランドは、任意の符号付きまたは符号なし整数型にすることができます。[強調鉱山]

ビットシフトで符号付き第2オペランドを使用するように人々を招待するのはなぜですか?なぜそれを許可するのですか?コンパイラはそれに対して警告しますか?

4

1 に答える 1

4

なぜ現状のままなのかはわかりませんが、符号付きの値でシフトできるのはうれしいです。

3式の中にa <<= 3;はintがあります。
によるシフトintが違法である場合、あなたはしなければならないでしょうa <<= 3U;

符号付きの値でシフトすることを違法にすることは、コードの多く(私はたくさんのことを意味します)を壊します!

于 2011-04-14T13:44:35.770 に答える