为了账号安全,请及时绑定邮箱和手机立即绑定

谁能帮我解释下这两题的答案?第一题:34,12;第二题:9?

谁能帮我解释下这两题的答案?第一题:34,12;第二题:9?

富国沪深 2022-05-11 19:15:57
第一题:#include<iostream.h>#include<iomanip.h>void main(){union{short int i;char s[2];}a;a.i=0x1234;cout<<hex<<(int)a.s[0]<<","<<hex<<(int)a.s[1]<<endl;}第二题:#include<iostream.h>void main(){union{int i[2];long k;char c[4];}r,*s=&r;s->i[0]=0x39;s->i[1]=0x38;cout<<s->c[0]<<endl;}
查看完整描述

1 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

在union中所有成员都是共用一块内存的
所以union使用时理论上只能是其中的一种情况,如第一个例子中,实际上只有i是有效的,虽然s也可以读写,但逻辑上是错的

由于共用同样的内存,所以当用s进行读写时,实际读到的就是i的空间,第一个问题的输出结果跟机器和编译运行环境有关,看你题目应该运行在16位系统下,所以int为16位,且存放int时将低8位放在前面,高8位放在后面,s[0]对应低8位,s[1]对应高8位,同时在输出的时候还进行了从char到int的强制转换,所以输出34 12
不同系统的位数不同,比如现在最常见的应该是32位,所以在不同机器上运行该代码结果可能不同

第二个问题中同样是内存共用,int的存储也是低8位在前面
所以c[0]对应i[0]的低8位为0x39
但这次没有进行强制int转换,所以输出char,ASCII码为0x39的char刚好是9,所以输出9

查看完整回答
反对 回复 2022-05-16
  • 1 回答
  • 0 关注
  • 139 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信