【发布时间】:2016-03-03 01:08:00
【问题描述】:
考虑以下小程序,它使用联合来直接分配整数的位,而不是使用位运算。 print 语句打印正确,但这并不意味着它总是有效。
这是在 C 中明确定义的行为吗?
#include <stdio.h>
#include <inttypes.h>
union IntBitField{
int32_t foo;
struct bitfield {
unsigned int BIT0:1;
unsigned int BIT1:1;
unsigned int BIT2:1;
unsigned int BIT3:1;
unsigned int BIT4:1;
unsigned int BIT5:1;
unsigned int BIT6:1;
unsigned int BIT7:1;
unsigned int BIT8:1;
unsigned int BIT9:1;
unsigned int BIT10:1;
unsigned int BIT11:1;
unsigned int BIT12:1;
unsigned int BIT13:1;
unsigned int BIT14:1;
unsigned int BIT15:1;
unsigned int BIT16:1;
unsigned int BIT17:1;
unsigned int BIT18:1;
unsigned int BIT19:1;
unsigned int BIT20:1;
unsigned int BIT21:1;
unsigned int BIT22:1;
unsigned int BIT23:1;
unsigned int BIT24:1;
unsigned int BIT25:1;
unsigned int BIT26:1;
unsigned int BIT27:1;
unsigned int BIT28:1;
unsigned int BIT29:1;
unsigned int BIT30:1;
unsigned int BIT31:1;
} bar;
} FooBar;
int main(){
FooBar.foo = 0;
printf("Size of the union: %zu\n", sizeof(union IntBitField));
printf("Before setting any bits %"PRId32"\n", FooBar.foo);
FooBar.bar.BIT31 = 1; // Highest order bit
printf("Set BIT31 %"PRId32"\n", FooBar.foo);
}
我查看了this question 和this question,以及this question,但我仍然不确定。
【问题讨论】:
-
int并不总是 32 位长。 -
@MikeCAT,我已经更正了这个问题以更好地表达我的意图。
-
你应该包含
inttypes.h并使用"%"PRId32而不是"%d"来打印int32_t。 -
@MikeCAT,这在技术上是正确的,但它与问题正交。如果您想对其进行编辑,请随时进行。
-
@merlin2011:请记住,问题不仅是你、我或 Mike 阅读的,还有那些倾向于养成坏习惯的初学者,比如在格式字符串中使用错误的类型说明符。对于您的代表,您的问题不应该出现如此简单的错误。另外,我不明白您为什么不始终使用
int32_t。这将使对int宽度的担忧变得无关紧要。我也不确定为什么你只想将-1和0存储在位中(假设为2 的补码int)。我认为有点应该符合_Bool和一般的布尔运算符,因此0和1。
标签: c gcc language-lawyer unions bit-fields