union a {int a; char b[2];}x; main() {x.a=3; x.b[0]=1; x.b[1]=2; printf("%d%d%d",x.a,
答案:2 悬赏:30 手机版
解决时间 2021-02-15 19:39
- 提问者网友:难遇难求
- 2021-02-15 01:35
union a {int a; char b[2];}x; main() {x.a=3; x.b[0]=1; x.b[1]=2; printf("%d%d%d",x.a,x.b[0],x.b[1])
最佳答案
- 五星知识达人网友:过活
- 2021-02-15 02:10
union的内存取决于其中成员所占内存最大的内存量,在这个union中a有int和char[2],假设int是4位的,那么他就是4字节内存,而union中的成员是共享内存的。
1 2 3 4字节都是int的,
3 4是char[2]的,char[0]占4,char[1]占3(当然也是int的)
原来x.a=3使得内存变成了0x00000003(16进制)而在改变了3和4之后,int的内存也就变成了0x00000201(16进制)所以输出x.a的时候,是513追问为什么要从十进制变成十六进制?x.a=3使得内存变成了0x00000003(16进制)追答这只是表达方式而已,数值是没有变化的,在计算机内存当中都是0或者1,用16进制可以让位数少点方便表示。同样是3 32位内存的话需要32位来表示,16进制就只需要8位而已。。其实本质没区别的。
1 2 3 4字节都是int的,
3 4是char[2]的,char[0]占4,char[1]占3(当然也是int的)
原来x.a=3使得内存变成了0x00000003(16进制)而在改变了3和4之后,int的内存也就变成了0x00000201(16进制)所以输出x.a的时候,是513追问为什么要从十进制变成十六进制?x.a=3使得内存变成了0x00000003(16进制)追答这只是表达方式而已,数值是没有变化的,在计算机内存当中都是0或者1,用16进制可以让位数少点方便表示。同样是3 32位内存的话需要32位来表示,16进制就只需要8位而已。。其实本质没区别的。
全部回答
- 1楼网友:青灯有味
- 2021-02-15 02:44
union a
{
int a;
char b[2];
}x;
x.a=3; // 由于 a,b 是联合体, a 实际对应的4个字节值为: 3, 0, 0, 0;
x.b[0]=1; // a 实际对应的4个字节值为: 1, 0, 0, 0; 也就是 a = 0x00000001
x.b[1]=2; // a 实际对应的4个字节值为: 1, 2, 0, 0; 也就是 a = 0x00000201
printf("%d%d%d",x.a,x.b[0],x.b[1]) // 输出 51312
{
int a;
char b[2];
}x;
x.a=3; // 由于 a,b 是联合体, a 实际对应的4个字节值为: 3, 0, 0, 0;
x.b[0]=1; // a 实际对应的4个字节值为: 1, 0, 0, 0; 也就是 a = 0x00000001
x.b[1]=2; // a 实际对应的4个字节值为: 1, 2, 0, 0; 也就是 a = 0x00000201
printf("%d%d%d",x.a,x.b[0],x.b[1]) // 输出 51312
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯