工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 1505|回复: 4

百思不得其解????

[复制链接]
发表于 2008-2-25 14:28 | 显示全部楼层 |阅读模式
a)
#i nclude <stdio.h>
union
{
int i;
char x[2];
}a;


void main()
{
a.x[0] = 10;
a.x[1] = 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共用一块地址空间)
 楼主| 发表于 2008-2-25 14:47 | 显示全部楼层
有请高手解释下两个程序的输出结果是怎么回事???
回复

使用道具 举报

发表于 2008-2-25 15:37 | 显示全部楼层
内存组织union是重叠的,地址低位对齐;而struct是顺序的,所以i和half共用地址,低位对齐;经过OS映射后高位对应逻辑高,低位对应逻辑低。另外,这个结果应该是跟机器和OS有关。
回复

使用道具 举报

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

使用道具 举报

发表于 2008-3-9 16:49 | 显示全部楼层
同理第二题也一样,懒得写了....
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2024-5-15 13:37

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表