0

我知道工会的规模是其最大成员的规模。我无法推断它是如何表示的。考虑情况

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);
   }

输出将是什么以及如何生成?提前致谢

4

1 回答 1

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 位)

现在这也非常依赖于您的处理器的字节序。此示例基于 little endien,例如 intel 处理器。大端处理器将扭转这些数字。

如果您要为小于完整联合大小的成员分配值,则如果该实例以前从未使用过,则其余空间是未定义的,并且将包含之前使用过的剩余空间前。编译器仅写入您正在写入的成员占用的内存部分,并屏蔽其余部分以免打扰它。以下代码:

printf( "\n" );
printf( "%x\n", obj.longval );
obj.charvals[2] = 0x193;
printf( "%x\n", obj.longval );

产生以下结果:

12fe6497
12936497

请注意,不是写入0x193,而是只0x93写入,其余数据保持不变。

于 2013-05-23T21:19:54.270 回答