C语言问题,帮忙解答一下!!!

来源:百度知道 编辑:UC知道 时间:2024/06/28 23:50:07
已知字符0的ASCII码为十六进制的30,下面程序的输出是
      main()
    { union { unsigned char c;
    unsigned int i[4];
    } z;
    z.i[0]=0x39;
    z.i[1]=0x36;
    printf("%c\n",z.c);}
A) 6 B) 9 C) 0 D) 3
帮我解释一下运算过程!!

)已知字符0的ASCII码为十六进制的30,下面程序的输出是

A}6 B}9 C}0 D}3

main()

{union{unsigned char c;

unsigned int i[4];

}z;

z.i[0]=0x39;

z.i[1]=0x36;

printf(“%、n”,z.c);}

B
因为定义的是一个联合体。所以它在内存中占的字节数是8,它们公用这个存储空间,而且这几个成员之间是相互覆盖的。
就这个题来说,比如给在分配的内存起始地址是1000,那么成员c的值从地址值为1000的地方读取,成员i从1000,1001.。。。1007中取得,0的ascII是30,那么0x39就是9,存在地址为1000的地方,所有显示z.c就是9

9

z存储为0x39 0x00 0x36 0x00

当以char取出时,z.c就是0x39了显示为字符就是9

没有可解释的运算过程,就是个union概念的问题
z.i[]与z.c公用内存
z.i[0]=0x39;<=>z.c=0x39;
C语言中,字符与数字是通用的,z.c=0x39是合法的,以字符的形式解释z.c就是9,<=>z.c="9",