C++ C联合字符数组打印';d';在mac上?

C++ C联合字符数组打印';d';在mac上?,c++,c,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 我的问题是…为什么要打印“d”?我改变了顺序,但输出仍然相同。但是如果我在联邦之外声明一个字符

我是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
我的问题是…为什么要打印“d”?我改变了顺序,但输出仍然相同。但是如果我在联邦之外声明一个字符f[20],那么就不会打印任何内容。 我正在使用MacBook lion图像和xcode。
提前感谢

'd'
的ASCII码是100。将
a
设置为100相当于将
b
设置为
{'d'、'\0'、'\0'、'\0'、…noise…}
(在32位little endian机器上),这将
printf
视为
“d”
,以下程序可以帮助您更好地理解:

#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);
}
#包括
typedef联合
{
INTA;
浮点数c;
charb[20];
}
工会;
无效转储(常量无效*缓冲区,大小\u t长度)
{
尺寸i;
对于(i=0;i
输出为:

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 工会y:100-d-0.000000 工会的内容是: 64 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 实际上,a的二进制表示形式(即
int
)是
64 00
,以小端十六进制表示为100。b的二进制表示形式是
64 00…
,0x00结束字符串,而0x64是“d”。c的二进制表示是
64 00
,在中为0.0,因为非零部分是指数

我改变了顺序,但输出仍然相同

联合体中元素的顺序不会改变任何东西,因为联合体的所有元素都使用同一块内存。您的代码为
y.a
打印
100
,为
y.b
打印
d
,因为这两个表达式解释相同的字节。因此,例如,如果添加一行设置
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.b
发生变化,您就会看到
y.a
y.c.
发生变化,反之亦然
y.a
在第二个
printf()
中应更改为102,因为这是
'f'

的ASCII字符代码,为什么
c
打印为
0.0000
?@0x499602D2:因为存储在内存中的方式。另外,为什么有
\0,\0
和什么是
噪声
@0x499602D2联合的大小是其最长元素的大小,在您的示例中为20字节。设置整数将设置前4个字节(在32位计算机上),其余16个字节(噪声)未初始化。@Sulthan Wow感谢您的清除!我对工会不太熟悉。+1是一个有用的例子。然而,
c
不是0.0,它是1.401298464324817e-43(低于正常值),
%f
报告为0.00000。非零部分实际上是有效位的低端,指数为0。在big-endian体系结构上,由于非零指数,您将得到9.44473296573929e+21。嗨,Marcelo,谢谢您的更正。你知道1.401…e-43是怎么来的吗?我可以从“%g”中获取此数字,但最小浮点值应仅为1.175494351e-38F。