2016-09-27 7 views
1

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の標準に従って正しい動作ですか?

+0

追加情報:第2の命令がVariable._Dataのトップ16ビットをクリアします。 – Coda

+0

アンダースコアと大文字で始まる名前は、実装のために予約されていません。 (小文字を使用することもできますが、これはメンバーにとってはC言語でも一般的です)。 – Olaf

+0

ペンとペーパーを手に入れ、両方の定数のビットパターンを書き留めます。そして、これらのパターンの式を手動で処理します。 – Olaf

答えて

0

コードの2つの部分がどのように異なってコンパイルされているかについての所見を投稿するのを待っている間に(そして私のコメントはあなたに答えを考えさせるように思われるが、これが正しい答えは、おそらく起こっていることは次のようなものです:

命令Variable._Data &= ~3uL;は、符号なしlongリテラルとlong値の論理積をとります。

命令Variable._Data &= ~3u;は、符号なし(ではなく、)のリテラルを取り、それをゼロに拡張してからlong値でANDします。

したがって、これらの命令は、ほとんどの場合、正しいオペランドにリテラルを宣言する方法が異なるため、コンパイルが異なります。これは、おそらく左のオペランドとは関係なく、オペランド間で実行しているオペレーションとは関係ありません。

これまでのところ、これは私の推測です。コードの2つの断片がどのように異なる方法でコンパイルされているかについての正確な結果を投稿してください。私は自分の答えを修正するかもしれません。

+1

追加情報:2番目の命令は、Variable._Dataの上位16ビットをクリアします。 – Coda

+0

ああ、私はそれを逃した。 –

+0

古いコメントを編集する時間が短すぎます....申し訳ありませんが、私はこのプラットフォームを初めて使っています。 ありがとうございます。これは基本的に私が「コンパイラはおそらくキャストを行いますが、バイナリの後ではない」と仮定しています。 あなたの答えに関して、私は分解を見ました。結果は、「追加情報:2番目の命令はVariable._Dataの上位16ビットをクリアします」で説明したとおりです。これは基本的にあなたが今でも仮定したものです。 Btw、私は[link](https://ideone.com/XKu5rI)でも問題を再現しました。別々の作業が分断されると、より包括的になります。 – Coda

0

これらの2つの式が等しくない、バグがありません:

Variable._Data &= ~3uL; 

Variable._Data &= ~3u; 

両方がゼロアウトう最下位2ビット。しかし、2番目のビットだけが最上位16ビットをゼロにします。あなたのマシンでは、int型の幅は16ビットで、長さは32ビットです。

&=操作が実行される前に、単体~演算子が整数リテラルに適用されます。(あなたのマシン上の)相違点は次のとおりです。

操作〜3LU結果に:操作〜3Uは、その結果に0xFFFFFFFC

:0xFFFC、その後長いに昇格されます。0x0000FFFC

これら2つの値を適用した結果Variable._Dataは上記とは異なる。

Variable._Data &= 0xFFFFFFFC; 

2つ目は、次のとおりです:

まず一つはある

Variable._Data &= 0x0000FFFC; 
関連する問題