共用体问题
题目一:输出下面的值#include <stdio.h>
main ()
{
union
{
int a;
long b;
char c;
}s;
s.a=0x39;
s.a=0x38;
printf("%lx\n",s.b);
printf("%c\n",s.c);
}
第一个 A 390038 B380039 C 3938 D 3839
第二个 A39 B 9 C 38 D 8
答案是 BB,请大神解释下,尤其是为什么是380039 不是390038,不应该39在前面吗,第二个9又是怎么来的
本帖最后由 time1970 于 2020-3-22 01:52 编辑
这个和机器内存地址是大端地址还是小端地址有关
比如:0x01234567
大端法:
地址:0x100 0x101 0x102 0x103
01 23 45 67
小端法:
地址:0x100 0x101 0x102 0x103
67 45 23 01
根据题目中的意思,int占两个字节,long占4个字节,char占一个字节
地址:0x100 0x101 0x 102 0x103
39 00 38 00
如果以long形式读取,结果为0x 00380039 ,去掉前面的00, 380039
如果以char形式读取,结果为0x39,那么0x39,正好是字符9的ascii码,注意格式是%c 本帖最后由 sunrise085 于 2020-3-22 20:46 编辑
首先要知道以下三点:
1、机器一般都是小端存储,
2、int占2个字节,long占4个字节,char占1个字节
3、联合体各个成员变量共用地址
b占四个字节单元,a占前两个单元,a占后两个单元,c从前向后占四个单元,0X39就是字符'9'的ASCII码,因此,c输出的就是9
然后看下图,帮你画的是四个字节空间,
本帖最后由 张世来4610484 于 2020-3-22 20:17 编辑
time1970 发表于 2020-3-22 00:25
这个和机器内存地址是大端地址还是小端地址有关
比如:0x01234567
大端法:
不懂大端小端,刚才搜了下,是这样理解的,这个题int 占两个字节,long占4个字节,char 占1个字节;
所谓的大端小端存放,是以单个数据为单位存放的,也就是说a,a在内存中,不论大端小端,a位置永远在前,a位置永远在后;
如果按照大端存放那a就是0039,a就是0038,合起来就是00390038,那么小端就是39003800,这个小端位置的互换是指单个数据前后换,
而不是a,a也要换,如果a,a也要换那就是38003900,我这么理解是对的吗?
如果小端是39003800,以long输出的话,从后往前读取就是00380039,省略0就是380039;以char输出取最前面的十六进制39两位,对应字符9,
我这段话这么理解有错吗,麻烦请指点下。 sunrise085 发表于 2020-3-22 00:28
首先要知道以下三点:
1、机器一般都是小端存储,
2、int占4个字节,long占8个字节,char占1个字节
不对吧,我感觉这个题的int应该是2个字节的,哪有long是8个字节的 张世来4610484 发表于 2020-3-22 19:40
不对吧,我感觉这个题的int应该是2个字节的,哪有long是8个字节的
本帖最后由 time1970 于 2020-3-22 20:38 编辑
张世来4610484 发表于 2020-3-22 19:36
不懂大端小端,刚才搜了下,是这样理解的,这个题int 占两个字节,long占4个字节,char 占1个字节;
...
对的,要明白,计算机中数据的存储都是通过内存地址,没有所谓的前后,你只要按照地址去理解就好
举个例子,内存地址就好比房间号,每个房间只能放一个字节。
房间号小的放二进制的高位就是大端法存储方式
房间号小的放二进制的低位就是小端法存储方式 张世来4610484 发表于 2020-3-22 19:40
不对吧,我感觉这个题的int应该是2个字节的,哪有long是8个字节的
嗯嗯你说的对。我昨晚想错了。现在修改过来了。 sunrise085 发表于 2020-3-22 00:28
首先要知道以下三点:
1、机器一般都是小端存储,
2、int占2个字节,long占4个字节,char占1个字节
我有新问题了,帮我看看
页:
[1]