我是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。 提前谢谢
答案 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 00
,IEEE 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字符代码。