1

私は C++ でいくつかの共用体を扱っており、次の場合に定義された動作が何であるかを判断しようとしています:

次のように定義された共用体があるとします。

union word_t {
   struct fields_t {
      unsigned int x      :  8;
      unsigned int y      :  8; 
      unsigned int height :  8; 
      unsigned int width  :  8;
   } fields;

     unsigned int word;
  } word;

そして、次のように割り当てようとします:

word.fields.x = 300;

私は VS2005 でこれを実験しましたが、他のユニオン フィールドに悪影響を与えることなく、範囲外のビットをマスクして有効なビットを格納しているようです。これが処理されると予想していた方法ですが、それを裏付けるドキュメントを見つけることができませんでした。これは定義された動作ですか、それとも実装固有ですか?

4

3 に答える 3

1

動作は明確に定義されています。C++ 標準4.7 [conv.integral] に従って、符号なし整数型の演算はモジュロ2^nで実行されます。ここnで、 は型を表すために使用されるビット数です。これはビットフィールドにも当てはまります。したがってword.fields.x = 300;は と同等word.fields.x = 44;です300 == 44 (modulo 256)

于 2013-11-07T20:55:07.850 に答える
1

期待どおりに動作します。「x」変数は「word」の最上位 8 ビットを持ち、「width」は「word」の最下位 8 ビットを持ちます。x を変更すると、「ワード」の上位 8 ビットのみが変更されます。以下は同じ効果があります。

const uint16_t N = 5;

word.word = static_cast<uint32_t>(N)<<24 | (word & 0x00FFFFFF);
word.x = N;

実装固有ではありません。

于 2013-11-07T20:47:39.897 に答える