michael175 发表于 2008-2-25 14:28

百思不得其解????

a)
#i nclude <stdio.h>
union
{
int i;
char x;
}a;

void main()
{
a.x = 10;
a.x = 1;
printf("%d",a.i);
}
答案:266 (低位低地址,高位高地址,内存占用情况是Ox010A)
b)
   main()
   {
          union{                   /*定义一个联合*/
               int i;
               struct{             /*在联合中定义一个结构*/
                  char first;
                  char second;
               }half;
          }number;
          number.i=0x4241;         /*联合成员赋值*/
          printf("%c%c\n", number.half.first, mumber.half.second);
          number.half.first='a';   /*联合中结构成员赋值*/
          number.half.second='b';
          printf("%x\n", number.i);
          getch();
   }
答案: AB   (0x41对应'A',是低位;Ox42对应'B',是高位)
      6261 (number.i和number.half共用一块地址空间)

michael175 发表于 2008-2-25 14:47

有请高手解释下两个程序的输出结果是怎么回事???

gyCai 发表于 2008-2-25 15:37

内存组织union是重叠的,地址低位对齐;而struct是顺序的,所以i和half共用地址,低位对齐;经过OS映射后高位对应逻辑高,低位对应逻辑低。另外,这个结果应该是跟机器和OS有关。

jinry 发表于 2008-3-9 16:47

第一个,int在这里应该是32bit的,你用char数组的方式赋值,相当于只赋了前面的16bit,所以高16bit结果未知,同时,在低位,应该是低字节的是10即0x0a,然后第二个字节是01,所以是0x10A,但是实际上个union的值是不确定的,因为高16bit内容未知,或者说和编译器相关

jinry 发表于 2008-3-9 16:49

同理第二题也一样,懒得写了....
页: [1]
查看完整版本: 百思不得其解????