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

第一题:
#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;
}

富国沪深
浏览 140回答 1
1回答

RISEBY

在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
打开App,查看更多内容
随时随地看视频慕课网APP