我知道工会的规模是其最大成员的规模。我无法推断它是如何表示的。考虑情况
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);
}
输出将是什么以及如何生成?提前致谢
我知道工会的规模是其最大成员的规模。我无法推断它是如何表示的。考虑情况
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);
}
输出将是什么以及如何生成?提前致谢
您的工会没有名为 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 位)
现在这也非常依赖于您的处理器的字节序。此示例基于 little endien,例如 intel 处理器。大端处理器将扭转这些数字。
如果您要为小于完整联合大小的成员分配值,则如果该实例以前从未使用过,则其余空间是未定义的,并且将包含之前使用过的剩余空间前。编译器仅写入您正在写入的成员占用的内存部分,并屏蔽其余部分以免打扰它。以下代码:
printf( "\n" );
printf( "%x\n", obj.longval );
obj.charvals[2] = 0x193;
printf( "%x\n", obj.longval );
产生以下结果:
12fe6497
12936497
请注意,不是写入0x193
,而是只0x93
写入,其余数据保持不变。