为联合中的位域分配无效值
Assigning invalid values to bitfields in a union
我正在与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;
它不是特定于实现的。
相关文章:
- 属性分配无效:"displayText"是文本字段 qml 中的只读属性
- 对象分配-成员函数的使用无效错误
- libtorrent file_storage无效:分配错误
- Realloc():即使使用malloc()分配内存,旧大小也无效
- 无效的char阵列分配
- 分配大小无效:4294967295 字节
- 无效的free() / delete / delete[] / realloc(), 4 字节在大小为 16 的块内分配
- 从模板分配无效指针
- 矢量无效的分配大小
- 从dll调用函数时分配大小无效
- QtQuick:QQmlApplicationEngine无法加载组件qrc:/main.qml:23附加对象分配无效
- 无效解除分配时的 xmemory0 异常
- 为联合中的位域分配无效值
- 间接数组分配有效,而直接数组分配无效
- std::vector 的替代方案,因为重新分配会使指向元素的指针无效
- 视觉对象C++:分配大小无效.为什么会这样
- 解除分配无效双指针
- 分配大小无效?C++
- 是否可以在不使指针无效的情况下调整/重新分配大块内存
- 无效的分配大小(在派生类复制构造函数中)