为联合中的位域分配无效值

Assigning invalid values to bitfields in a union

本文关键字:分配 无效 位域      更新时间:2023-10-16

我正在与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中对此进行了实验,它似乎掩盖了超出范围的位并存储了有效的位,而不会对联合的其他字段产生任何不利影响。这就是我期望的处理方式,但我无法找到任何文档来支持它。这是定义的行为,还是特定于实现的行为?

行为定义良好。根据C++标准 4.7 [conv.integral],对无符号整型的操作以模2^n执行,其中n是用于表示类型的位数;这也适用于位字段。所以word.fields.x = 300;等价于word.fields.x = 44;,因为300 == 44 (modulo 256)

字段

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

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

它按预期工作。"x"变量将具有"字"的最有效8位,"宽度"将具有"字"的最不重要的8位。更改 x 只会更改最重要的 8 位"字"。以下具有相同的效果:

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

它不是特定于实现的。