我知道union的大小是其最大成员的大小。我无法推断它是如何表现的。 考虑一下情况
union x
{
int a;
char b;
short int c;
}obj;
int main()
{
obj.a=3;
printf("%d %c %d",obj.a,obj.b,obj.c);
}
输出是什么以及如何生成? 提前致谢
答案 0 :(得分:1)
您的联盟没有名为x的成员,因此假设您为其中一个成员分配值,其余成员将获取该值的一部分。例如:
union x
{
long longval;
char charvals[4];
short shortvals[2];
char oneCharVal;
short oneShortVal;
} obj;
obj.longval = 0x12fe6497;
printf( "c1: %x, c2: %x, c3: %x, c4: %x\n", obj.charvals[0], obj.charvals[1], obj.charvals[2], obj.charvals[3] );
printf( "s1: %x, s2: %x\n", obj.shortvals[0], obj.shortvals[1] );
printf( "oneCharVal: %x\n", obj.oneCharVal );
printf( "oneShortVal: %x\n", obj.oneShortVal );
将打印:
c1: 97, c2: 64, c3: fe, c4: 12
s1: 6497, s2: 12fe
oneCharVal: 97
oneShortVal: 6497
为了清楚起见,我故意忽略了标志。 %x打印一个int,通常是32位,所以它会在打印前将chars和short转换成long并实际打印:
c1: ffffff97, c2: 64, c3: fffffffe, c4: 12
s1: 6497, s2: 12fe
oneCharVal: ffffff97
oneShortVal: 6497
要按照我最初展示的方式打印数字,您需要更改printf格式,如下所示:
printf( "c1: %hhx, c2: %hhx, c3: %hhx, c4: %hhx\n", obj.charvals[0], obj.charvals[1], obj.charvals[2], obj.charvals[3] );
printf( "s1: %hx, s2: %hx\n", obj.shortvals[0], obj.shortvals[1] );
printf( "oneCharVal: %hhx\n", obj.oneCharVal );
printf( "oneShortVal: %hx\n", obj.oneShortVal );
我在这个例子中使用十六进制数字来清楚地说明数字是如何分开的,因为每两位数字是一个字节(8位)
现在这也非常依赖于处理器的内部性。这个例子基于很少的endien,就像intel处理器一样。大型内部处理器会扭转这些数字。
如果要为一个小于完整联合大小的成员分配一个值,那么如果以前从未使用过该实例,那么剩余的空间是未定义的,并且如果它之前将包含其余的内容。以前用过的。编译器只写入您正在写入的成员占用的内存部分,并屏蔽其余部分,以免打扰它。以下代码:
printf( "\n" );
printf( "%x\n", obj.longval );
obj.charvals[2] = 0x193;
printf( "%x\n", obj.longval );
产生以下结果:
12fe6497
12936497
请注意,不是写0x193
,而是只写0x93
而其余数据保持不变。