unsigned short与匿名位域联合的初始化截断差异问题
问题原因解析
这是C语言聚合类型初始化规则导致的差异:当用大括号初始化union时,编译器会优先初始化union中第一个声明的成员。
- 对于
v1_t,它的第一个成员是匿名位域结构体,而结构体的第一个成员是4位的d1。所以v1_t v1 {256};会被解析为给d1赋值。由于d1仅占4位,256的二进制是100000000,截断到4位后就是0000,最终d1的值为0,整个union的data也随之变为0。 - 对于
v2_t,它的第一个成员是unsigned short data,所以v2_t v2 {256};直接给data赋值256,位域成员会对应这个值的位分布,表现符合预期。
本质上,union的初始化目标由声明时的成员顺序决定,和你期望赋值的成员无关——v1_t的初始化逻辑优先匹配了第一个成员(匿名结构体的d1),而非data。
内容的提问来源于stack exchange,提问作者deponovo
相关产品推荐
相关产品推荐

