为联合中的位字段指定无效值 我正在与C++中的一些工会合作,我正在尝试确定下面的情况下定义的行为是:

为联合中的位字段指定无效值 我正在与C++中的一些工会合作,我正在尝试确定下面的情况下定义的行为是:,c++,visual-c++,C++,Visual 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.fi

假设我有一个定义如下的联盟:

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中对此进行了试验,它似乎可以屏蔽超出范围的位并存储有效位,而不会对联合的其他领域产生任何不利影响。这是我所期望的处理方式,但我还没有找到任何文档来支持它。这是定义的行为,还是特定于实现的行为?

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


我没有意识到工会的重要性。

它如预期的那样起作用。”x'变量将具有'word'的最高有效8位,而'width'将具有'word'的最低有效8位。更改x只会更改“word”的最高有效8位。以下内容具有相同的效果:

const uint16_t N = 5;

word.word = static_cast<uint32_t>(N)<<24 | (word & 0x00FFFFFF);
word.x = N;
const uint16\u t N=5;

word.word=static_cast(N)行为定义明确。根据C++标准<强> 4.7〔整数值〕<强>,对无符号整数类型的运算是模<代码> 2 ^ n <代码>,其中代码> n</代码>是用来表示类型的位数;这也适用于位字段。因此
word.fields.x=300
相当于
word.fields.x=44300==44(模256)

不清楚你在问什么。请描述您预期的行为以及观察到的情况。您能否提供一个示例代码使其更加清晰?为什么不使用uint8\t或unsigned char?实际上,你也应该用uint32\u t来表示单词。对于int类型,不同的平台可能有不同的位数。@Tolga我想我的位域在这种情况下是不好的例子。我有各种各样的并集,它们的字段长度都是非标准的(例如17位)@NickHartung所以
clang
在赋值时给了我这个警告
从“int”到位字段的隐式截断将值从300更改为44
,但我不知道这与并集有什么关系。