Cはバイナリ演算子をどのように処理しますか?標準でコンパイラがLVALUEにキャストする必要がありますか、それを必要としませんか?これらの定義でCバイナリ演算子がLVALUEまたはRVALUEの幅に適用されます
typedef union {
unsigned long _Data;
struct {
unsigned long _Reserved : 28;
unsigned long _Info : 1;
unsigned long _Reserved2 : 3;
};
} S_INFO;
S_INFO Variable;
、
Variable._Data &= ~3uL;
は、16ビットアーキテクチャでは
Variable._Data &= ~3u;
指示とは異なるコンパイル命令を次のように
具体的な問題は、私はルックスを発見しましたintは2バイト幅で、長さは4バイト幅です。
コンパイラは、&演算子をLVALUE Variable._Dataの幅ではなく、リテラル(RVALUE)の幅に適用するようです。
私はコンパイラのバグを発見しましたか、これはCの標準に従って正しい動作ですか?
追加情報:第2の命令がVariable._Dataのトップ16ビットをクリアします。 – Coda
アンダースコアと大文字で始まる名前は、実装のために予約されていません。 (小文字を使用することもできますが、これはメンバーにとってはC言語でも一般的です)。 – Olaf
ペンとペーパーを手に入れ、両方の定数のビットパターンを書き留めます。そして、これらのパターンの式を手動で処理します。 – Olaf