
C语言的联合体问题
#include<stdio.h>voidmain(){union{inti;struct{charfirst;charsecond;}half;}number;numb...
#include <stdio.h>
void main()
{
union
{
int i;
struct
{
char first;
char second;
}half;
}number;
number.i=0x4241;
printf("%c%c\n", number.half.first, number.half.second);
number.half.first='a';
number.half.second='b';
printf("%x\n", number.i);
}
输出结果为:
AB
6261
怎么得来的,想要知道过程解析!拜托各位大侠们了!!! 展开
void main()
{
union
{
int i;
struct
{
char first;
char second;
}half;
}number;
number.i=0x4241;
printf("%c%c\n", number.half.first, number.half.second);
number.half.first='a';
number.half.second='b';
printf("%x\n", number.i);
}
输出结果为:
AB
6261
怎么得来的,想要知道过程解析!拜托各位大侠们了!!! 展开
5个回答
展开全部
union
{
int i;
struct
{
char first;
char second;
}half;
}number;
这里面相当于两个元素,一个元素int 占四个字节(早期是两个字节)
一个元素是结构体类型的占有两个字节其中低八位是char first 高八位为char second;
这两个元素公用一段内存空间,当你把i = 0x4241的时候i的内存表示形式为0x4241高八位为0x42而低八位为0x41而正好大写字母A的ascall 值为0x41 而B为0x42
后面的也就类似这样解释。
楼主你其实可以把上面的
number.half.first='a';
number.half.second='b';试着只用一行语句而不两行同时使用的结果。
比如把上面number.half.first='a'; 注释掉,结果就变成了高八位为0x62 而低八位还是0x41
所以结果输出就会改变为6241
{
int i;
struct
{
char first;
char second;
}half;
}number;
这里面相当于两个元素,一个元素int 占四个字节(早期是两个字节)
一个元素是结构体类型的占有两个字节其中低八位是char first 高八位为char second;
这两个元素公用一段内存空间,当你把i = 0x4241的时候i的内存表示形式为0x4241高八位为0x42而低八位为0x41而正好大写字母A的ascall 值为0x41 而B为0x42
后面的也就类似这样解释。
楼主你其实可以把上面的
number.half.first='a';
number.half.second='b';试着只用一行语句而不两行同时使用的结果。
比如把上面number.half.first='a'; 注释掉,结果就变成了高八位为0x62 而低八位还是0x41
所以结果输出就会改变为6241
展开全部
联合体,就是其中的成员公用一段内存。内存的大小由最大的那个成员的大小觉得。
所以你定义的number的大小就是四个字节。
而你使用的时候,后面的操作就会将前面的值覆盖掉。
所以你之前的0x4241就被后面的'a'和'b'覆盖掉了。
内存中是以栈的方式分配的,所以打印出来就是反的。(‘a' 的16进制就是61,'b'是62)
所以你定义的number的大小就是四个字节。
而你使用的时候,后面的操作就会将前面的值覆盖掉。
所以你之前的0x4241就被后面的'a'和'b'覆盖掉了。
内存中是以栈的方式分配的,所以打印出来就是反的。(‘a' 的16进制就是61,'b'是62)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1、联合体又被称为共用体,从某个角度来说,共用体名字更合理。和结构体同属于C语言数据类型中的结构类型。
2、例如
uniuon data{ int i ; char c ;float f;}x;定义共用体类型名称为data类型,有三个属性,分别为
int i ; char c ;float f;这三个属性共同占用内存空间,所以空间占用选属性中占用最多的那个,也就是float f。占用四个字节。由于共同占用,所以在同一时间只能保留一个属性内容
如果为
struct data{ int i ; char c ;float f;}x;则表明定义结构体类型名称为data类型,也是三个属性,不过在内存中占用的是空间大小是三个属性之和。若int类型在编译器中分配4字节的话,总共分配字节数位4+1+4总共9字节。
由于单独占用,所以在同一时间可以保留所有属性内容
2、例如
uniuon data{ int i ; char c ;float f;}x;定义共用体类型名称为data类型,有三个属性,分别为
int i ; char c ;float f;这三个属性共同占用内存空间,所以空间占用选属性中占用最多的那个,也就是float f。占用四个字节。由于共同占用,所以在同一时间只能保留一个属性内容
如果为
struct data{ int i ; char c ;float f;}x;则表明定义结构体类型名称为data类型,也是三个属性,不过在内存中占用的是空间大小是三个属性之和。若int类型在编译器中分配4字节的话,总共分配字节数位4+1+4总共9字节。
由于单独占用,所以在同一时间可以保留所有属性内容
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1) A B 的 ASCII码 分别为 65 , 65
十六进制 就是 0X41 0X42
类似 a b 分别是 97 98 十六进制 0X61 0X62
AB ->0X4142
2) union 取其中类型所占空间最大的类型的空间大小
sizeof(number)=sizeof(int)=4 (32位机器)
存储 先 first 后 second ,输出 是 先second 后 first
这里要看看 数据在机器中的表示形式了
你自己再看看,我知道的就是这样了,不知道你明白了不?
十六进制 就是 0X41 0X42
类似 a b 分别是 97 98 十六进制 0X61 0X62
AB ->0X4142
2) union 取其中类型所占空间最大的类型的空间大小
sizeof(number)=sizeof(int)=4 (32位机器)
存储 先 first 后 second ,输出 是 先second 后 first
这里要看看 数据在机器中的表示形式了
你自己再看看,我知道的就是这样了,不知道你明白了不?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
联合体内的元素共用内存,联合体变量的大小为联合体元素中最大的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |