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

字段值溢出会影响相邻变量(无论是位字段、整数还是其他变量),这将是一个主要的编译器错误。

工会的相关性使我无法理解。

于 2013-11-07T20:44:22.917 回答
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 回答
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 回答