C++ C联合字符数组打印';d';在mac上?
我是C/C++新手,但很想知道我所看到的问题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”?我改变了顺序,但输出仍然相同。但是如果我在联邦之外声明一个字符
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。