第一题:#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
- 1 回答
- 0 关注
- 139 浏览
添加回答
举报
0/150
提交
取消