论坛: 编程破解 标题: 请帮一下啊是关于c的 复制本贴地址    
作者: lovejiang [lovejiang]    论坛用户   登录
main()
{ union 运行结果:9
{ unsigned char c;
unsigned int i[4]; }z;
z.i[0]=0x39; z.i[1]=0x36;
printf(“%c\n”,z.c);}



[此贴被 lovejiang(lovejiang) 在 01月12日15时46分 编辑过]

地主 发表时间: 04-01-12 15:46

回复: 286 [unique]   版主   登录
帮你做什么?
为什么不直接把要求写在标题上呢?

B1层 发表时间: 04-01-12 15:48

回复: lovejiang [lovejiang]   论坛用户   登录
共用体所占内存空间的大小是所有成员中占用存
储空间最大的一个成员的占用空间的值。
z.i[0]=0x39; z.i[1]=0x36;
printf(“%c\n”,z.c);}
怎么根据Z.i[]的值来确定Z.c的值呢

B2层 发表时间: 04-01-13 11:46

回复: 286 [unique]   版主   登录
这个问题说起来简单,实际处理上是很难的。
1。在VC中int是四个字节,在TC中是两个字节。因此实现起来不一样。
2。数据在内存中的存储也不一样,PC机一般是高位在低位上,低位在高位上。另一些计算机则反之(比如MOTOLOLA)。比如计算机存储0x1234和0x5678时,内存中存的是34,12,78,56。
3。union类型是左对齐的类型。

不过,你的问题由于问题本身简单,所以没有我所说的那么复杂。
首先说z.i。也就是连续4个数的数组,每个占4位。共占16位。z.i[0]中存的值为0x39,(也就是字符9)。
然后是z.c。虽然只是一个char型的值,但与i[4]同级,所以它等于z.i[0]的第一个字节(但不是最高位字节,别问我为什么噢,自己到上面找)。所以z.c等于0x39。

所以最后的结果是9.


B3层 发表时间: 04-01-13 14:02

回复: 286 [unique]   版主   登录
你的程序不好分析,你用下面的程序分析吧。
#include <stdio.h>
main()
{
union
{
unsigned char c[4];
unsigned int i;
}z;
z.i=0x31323334;
printf("%c%c%c%c\n",z.c[0],z.c[1],z.c[2],z.c[3]);
}

B4层 发表时间: 04-01-13 14:03

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号