这一段简单的C语言结果是多少? 老师说的和实际的好像不一样,错在哪
voidmain(){union{chari[2];intk;}r;r.i[0]=2;r.i[1]=0;printf("%d",r.k);}老师说结果是2和实际的好像不一...
void main()
{
union
{
char i[2];
int k;
}r;
r.i[0]=2;
r.i[1]=0;
printf("%d",r.k);
}
老师说结果是2
和实际的好像不一样,错在哪 展开
{
union
{
char i[2];
int k;
}r;
r.i[0]=2;
r.i[1]=0;
printf("%d",r.k);
}
老师说结果是2
和实际的好像不一样,错在哪 展开
7个回答
展开全部
老师说的结果是2,有两个前提:
1. 字节序是小头字节序,即低位字节位于低地址空间,高位字节位于高地址空间,这样i[0]就是整型的最低位字节,r[1]就是整型次低位字节,如果是大头字节序,i[0]就变成了整型的最高位字节,i[1]就变成了整型的次高位字节;
2. 整型int是2字节长。否则如果是4字节长,还有2字节未被赋值,整型值不确定。
1. 字节序是小头字节序,即低位字节位于低地址空间,高位字节位于高地址空间,这样i[0]就是整型的最低位字节,r[1]就是整型次低位字节,如果是大头字节序,i[0]就变成了整型的最高位字节,i[1]就变成了整型的次高位字节;
2. 整型int是2字节长。否则如果是4字节长,还有2字节未被赋值,整型值不确定。
追问
用VC++6.0运行了结果是随机值。
追答
这就是整型是4字节的结果,有两个字节没有被赋值,是随机的。但有两个字节是确定的,你可以把这个随机值用计算器转成16进制看看就可以发现,有两个字节是0x00和0x02的值。
展开全部
结果就是2。
这里的int型数据是两个字节的,低字节是2,高字节是0,其二进制数按从低字节到高字节排列顺序是;
0000 0010 0000 0000
将上面的两个字节看做是一个整数,就是
0000 0000 0000 0010
也就是整数2
但是,如果是在32位字长的系统里,由于整数为4个字节,而上面只定义了两个低字节,而高字节没有定义,所以可能会是一些不确定的数据,所以显示出来的数字不一样,如果想显示2的话,做如下修改:
union{
char i[4];
int k;
}r;
r.i[0]=2,r.i[1]=r.i[2]=r.i[3]=0;
再显示r.k时为2
这里的int型数据是两个字节的,低字节是2,高字节是0,其二进制数按从低字节到高字节排列顺序是;
0000 0010 0000 0000
将上面的两个字节看做是一个整数,就是
0000 0000 0000 0010
也就是整数2
但是,如果是在32位字长的系统里,由于整数为4个字节,而上面只定义了两个低字节,而高字节没有定义,所以可能会是一些不确定的数据,所以显示出来的数字不一样,如果想显示2的话,做如下修改:
union{
char i[4];
int k;
}r;
r.i[0]=2,r.i[1]=r.i[2]=r.i[3]=0;
再显示r.k时为2
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我觉得是0 不是很懂 猜的
你想知道结果要先去了解下大小端的知识
不同机子存储机制会有不同 大端小端百度之
你想知道结果要先去了解下大小端的知识
不同机子存储机制会有不同 大端小端百度之
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
结果是2啊,r.k的值和r.i[0]的值是一样的
因为union里的地址是一样的,也就是说r.k内存地址和r.i[0]的地址是一样的,所以值是一样的
因为union里的地址是一样的,也就是说r.k内存地址和r.i[0]的地址是一样的,所以值是一样的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个结果是空的,没看到你在哪儿给k赋过值。(我错了)
在低端机的前提下,她的值是 0x cccc0002
若果是高端机的话。值为 0x 0200cccc
在低端机的前提下,她的值是 0x cccc0002
若果是高端机的话。值为 0x 0200cccc
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这r.k都没被赋值呀,怎么可能是2,你是不是代码弄错了?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果k没有输入具体值的话,默认值为0,所以r.k,即是
r.[0]
r.[0]
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询