C union char数组在mac上打印'd'?

时间:2013-04-20 02:27:07

标签: c++ c

我是C / C ++的新手,但很想知道我所看到的问题。

typedef union
{
   int a;
   float c;
   char b[20];
}
Union;

int main()
{
 Union y = {100};
 printf("Union y :%d - %s - %f \n",y.a,y.b,y.c);
}

输出

 Union y :100 - d - 0.000000

我的问题是......为什么要打印?我改变了联合中的顺序仍然是相同的输出。但如果我在联盟之外宣布一个字符[20],则不会打印任何内容。 我正在使用MacBook狮子图像并使用xcode。 提前谢谢

3 个答案:

答案 0 :(得分:10)

'd'的ASCII代码为100.将a设置为100相当于将b设置为{'d', '\0', '\0', '\0', …noise…}(在32位小端机器上), printf视为"d"

答案 1 :(得分:4)

以下程序可以帮助您更好地理解:

#include <stdio.h>

typedef union
{
    int a;
    float c;
    char b[20];
}
Union;

void dump(const void* buffer, size_t length)
{
    size_t i;
    for (i = 0; i < length;) {
        printf("%.2x ", reinterpret_cast<const unsigned char*>(buffer)[i]);
        ++i;
        if (i % 16 == 0) {
            putchar('\n');
        } else if (i % 8 == 0) {
            putchar(' ');
        }
    }
    if (i % 16 != 0) {
        putchar('\n');
    }
}

int main()
{
    Union y = {100};
    printf("Union y :%d - %s - %f \n",y.a,y.b,y.c);
    printf("The content of the Union is: \n");
    dump(&y, sizeof y);
}

输出结果为:

Union y :100 - d - 0.000000 
The content of the Union is: 
64 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 
00 00 00 00 

实际上, a (即int)的二进制表示形式为64 00 00 00,小端十六进制为100。 b 的二进制表示为64 00 ...,0x00结束字符串,而0x64为&#39; d&#39;。 c 的二进制表示为64 00 00 00IEEE float representation中的二进制表示为0.0,因为非零部分是指数。

答案 2 :(得分:2)

  

我更改了联合中的顺序仍然是相同的输出。

union中元素的顺序不会改变任何东西,因为union的所有元素都使用相同的内存。您的代码为100打印y.a,为d打印y.b,因为两个表达式都解释相同的字节。因此,例如,如果添加一行设置y.b然后再次打印:

Union y = {100};
printf("Union y :%d - %s - %f \n",y.a,y.b,y.c);
y.b = 'f';
printf("Union y :%d - %s - %f \n",y.a,y.b,y.c);

每当y.a发生变化时,您会看到y.c.y.b发生变化,反之亦然。 y.a应在第二个printf()中更改为102,因为这是'f'的ASCII字符代码。