| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 966 人关注过本帖
标题:求助。。!明天考试。。共用体。。
只看楼主 加入收藏
aaronhexin
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:67
专家分:199
注 册:2010-12-6
收藏
得分:0 
我也不说了,之前已经分析了,呵呵
我敢肯定这题在c编译器下多是57和9这个结果
2011-01-14 20:16
lqpqbyb
Rank: 1
等 级:新手上路
帖 子:18
专家分:8
注 册:2011-1-8
收藏
得分:0 
aaronhexin,有些地方提醒了对,不胜感激。
以下是题目详细分析步骤(有错的地方希望能指正):
共用体变量s所占的内存长度等于最长成员的长度,题目有三个成员:整形数组a[2]共占用内存4个字节;长整型b变量也占4个字节;字符数组c[4]也占4个字节。因此s占的内存长度为4字节。
共用体本身及共用体的各成员起始地址均是相同的。
aaronhexin指出字节存储顺序是按大小端来的,本人自己TC2是小端的,其它版本可能不一样吧。
存储过程如下:
s.a[0]=0x39,是16进制,十进制数就是57,二进制数就是:0000 0000 0011 1001
s.a[1]=0x38,是16进制,十进制数就是56,二进制数就是:0000 0000 0011 1000
当程序执行到这二条赋值语句结束时,本人TC是小端,因此存储结构顺序如下:

printf(“%ld\n”,s.b);当执行这条语句时 b为 0000 0000 0011 1000 0000 0000 0011 1001,转化成十进制数正好是3670073。
printf(“%c\n”,s.c[0]);c[0]为 0011 1001,十进制数正好是57,输出的是字符,因此是'9'(9的ASCII码为57)。
为了说明上面说的正确性。
把原先题目的程序稍微改动一下:
#include <stdio.h>main(){    union {int a[2];        long b;        char c[4];}s;    s.a[0]=-12;      /* 原先s.a[0]=57改为-12;*/    s.a[1]=0x38;printf(“%ld\n”,s.b);printf(“%c\n”,s.c[0]);}按照上面方法得出存储结构顺序如下:

负数的补码是正数补码按位取反加1,因此-12的补码:1111 1111 1111 0100;
输出结果:s.b=3670073;s.c[0]=ASCII码等于244的字符(不好打)。
Why?
b:0000 0000 0011 1000 1111 1111 1111 0100
对应的十进制数为3735540;
S.c[0]=-12,输出的格式是字符因此是ASCII码等于244的字符.
尝试把s.c[1]以%d输出为-1;
2011-01-14 20:20
aaronhexin
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:67
专家分:199
注 册:2010-12-6
收藏
得分:0 
正确,我也只是了解点皮毛,可能你的编译器long是64位的,而我的是32位的,所以我分析的时候输出结果是57
我分析那个char的时候有点问题
你分析的很对
2011-01-14 21:40
快速回复:求助。。!明天考试。。共用体。。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020921 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved