| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 525 人关注过本帖
标题:希望看到的高手帮帮忙解决下小弟的问题
只看楼主 加入收藏
自强
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:132
专家分:130
注 册:2011-10-3
结帖率:96.77%
收藏
已结贴  问题点数:20 回复次数:2 
希望看到的高手帮帮忙解决下小弟的问题
#include <stdio.h>
union un
{
    int i;
    char c[2];
}
main()
{
    union un x;
    x.c[0]='10';
    x.c[1]='1';
    printf("\n%d",x.i);
}

有人能帮我解释下这个程序 课本练习题的给出的答案是266 但是上机运行给出的是不定值啊 谢谢
搜索更多相关主题的帖子: include 练习题 课本 
2011-12-31 22:01
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:10 
我来说一下对这题的看法吧

首先我试了一下,确实会输出一个随机数,由于我不清楚union结构定义的初始化问题,所以我也搞不懂为什么会这样

但如果在赋值之前加一个x.i=0;进行初始化,那么输出会固定为12592,我说一下这个12592是怎么来的

union结构体一共占用4字节,执行x.c[0]='10'后,第一个字节存储的是'0',这个与c语言采用int类型来临时存储char类型有关,转化时只会保留最后一个字节

执行x.c[1]='1'后第二个字节存的就是'1',在ascii中,他们代表的分别是48和49

由于现在的电脑一般采用小端模式存储数据,所以x.i的值为49*2^8+48=12592
2011-12-31 22:17
liao06550107
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:2
帖 子:111
专家分:696
注 册:2011-10-2
收藏
得分:10 
这个跟编译器有关,在vc6中int占4个字节,而char占1个字节,即使把char[2]写满数据(一般是低位区共占8位),还剩8位高位区还有垃圾值,所以在编译器中会出现随机值。所以如果在int占2个字节的,而char占1个字节的编译器中,一定会得到一个定值。
程序代码:
/*
我认为作者可能把写错了x.c[0]='10' 和x.c[1]='1'应该为x.c[0]=10 和x.c[1]=1
对c[0]赋值10相当把00001010赋给i的低8位
对c[1]赋值1相当把00000001赋给i的高8位
这样i就是  00000001 00001010变成十进制就是266了
*/
#include <stdio.h>
union un
{
    short int i; //short占两个字节相当于c语言中的占两字节int
    char c[2]; //占两个字节
};

int main(void)
{
    union un x;
    x.c[0]='10'; //该地方只存0字符对应整型48二进制数为00110000(可改为x.c[0]=10)
    x.c[1]='1'; //对应于整型49二进制数为00110001(可改为x.c[1]=1)
                    
    printf("\n%c,\n%p,%p\n",x.c[0],&x.c[0],&x.c[1]); //输出c[0]的值, 输出x.c[0]和x.c[1]的地址从输出的地址可知,
                                                     //低地址位0012FF7C值为48(00110000),高地址为0012FF7D值为49(00110001),
                                                     //所以在内存地址0012FF7C-0012FF7D中为(0011000000110001)
                                                     //再看CPU解释顺序是大端模式还是小端模式
                                                     //若小端模式解释为整型变量值(0011000000110001)12592
    printf("\n%p,%d\n",&x.i, x.i);                     //若大端模式解释为整型变量值(0011000100110000)12337
    return 0;
}



[ 本帖最后由 liao06550107 于 2012-1-1 00:52 编辑 ]

听不同的音乐,看不同的书,游历不同的城市,邂逅不同的人,走的多了,站的高了,自然就看的远了。
2011-12-31 22:59
快速回复:希望看到的高手帮帮忙解决下小弟的问题
数据加载中...
 
   



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

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