以下编程,我做出来认为是13,为什么运行出来是3328

#include

union pw

{

int i;

char ch[2];

} a;

int main ( )

{

a.ch[0] = 0;

a.ch[1] = 13;

printf ( "%d\n", a.i ) ;

return 0;

}

因为使用的是联合体,特点是所有成员共享同一块内存。当你在代码中将 a.ch[0] 设置为 0 时,实际上也在清空 a.i 的值,接下来当你在代码中将 a.ch[1] 设置为 13 时,a.i 的值就变成了 3328。因为 a.i 和 a.ch[1] 共享相同的内存,修改了 a.ch[1],实际上也修改了 a.i。

在这个例子中,由于您将 a.ch[1] 设置为 13,所以二进制表示为 00001101。在大多数计算机系统中,int 类型是使用 4 个字节存储的,因此 a.i 就是:

0000 0000 0000 0000 0000 0000 0000 1101

由于您在前面将 a.ch[0] 设置为 0,所以实际上 a.i 的值就是:

0000 0000 0000 0000 0000 0000 0000 1101

十进制表示为 3328。

a.ch[0] = 0 存进去了 0000 0000

a.ch[1] = 13 存进去了 0000 1101
再给前面补0
内存中就是 0000 0000 0000 0000 0000 1101 0000 0000
一共4个字节的内存,转换成int型就是3328

a.i 没有初始化

#include<stdio.h>

union pw
{
    int i;
    char ch[2];
} a;

int main ( )
{
    a.i = 13;
    printf ( "%d\n", a.i ) ;
    return 0;
}

嗯……你确定你不是想输出ch[1]吗:

printf("%d\n", a.ch[1]);

之所以输出3328也只是编译器随机分配的初始值,它等同于0xddd。