鱼C论坛

 找回密码
 立即注册
查看: 1209|回复: 8

[已解决]共用体问题

[复制链接]
发表于 2020-3-22 00:11:07 | 显示全部楼层 |阅读模式
10鱼币
题目一:输出下面的值
  1. #include <stdio.h>
  2. main ()
  3. {
  4.         union
  5.         {
  6.                 int a[2];
  7.                 long b;
  8.                 char c[4];
  9.         }s;
  10.         s.a[0]=0x39;
  11.         s.a[1]=0x38;
  12.         printf("%lx\n",s.b);
  13.         printf("%c\n",s.c[0]);
  14. }
复制代码

第一个 A 390038   B  380039 C 3938 D 3839
第二个 A  39   B 9   C 38   D 8
答案是 B  B,请大神解释下,尤其是为什么是380039 不是390038,不应该39在前面吗,第二个9又是怎么来的
最佳答案
2020-3-22 00:11:08
本帖最后由 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

最佳答案

查看完整内容

这个和机器内存地址是大端地址还是小端地址有关 比如:0x01234567 大端法: 地址:0x100 0x101 0x102 0x103 01 23 45 67 小端法: 地址:0x100 0x101 0x102 0x103 67 45 23 01 根据题目中的意思,int占两个字节,long占4个字节,char占一个字节 地址:0x100 0 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-22 00:11:08 | 显示全部楼层    本楼为最佳答案   
本帖最后由 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-22 00:28:37 | 显示全部楼层
本帖最后由 sunrise085 于 2020-3-22 20:46 编辑

首先要知道以下三点:
1、机器一般都是小端存储,
2、int占2个字节,long占4个字节,char占1个字节
3、联合体各个成员变量共用地址

b占四个字节单元,a[0]占前两个单元,a[1]占后两个单元,c从前向后占四个单元,0X39就是字符'9'的ASCII码,因此,c[0]输出的就是9
然后看下图,帮你画的是四个字节空间,
4.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-22 19:36:23 | 显示全部楼层
本帖最后由 张世来4610484 于 2020-3-22 20:17 编辑
time1970 发表于 2020-3-22 00:25
这个和机器内存地址是大端地址还是小端地址有关
比如:0x01234567
大端法:


不懂大端小端,刚才搜了下,是这样理解的,这个题int 占两个字节,long占4个字节,char 占1个字节;
所谓的大端小端存放,是以单个数据为单位存放的,也就是说a[0],a[1]在内存中,不论大端小端,a[0]位置永远在前,a[1]位置永远在后;
如果按照大端存放那a[0]就是0039,a[1]就是0038,合起来就是00390038,那么小端就是39003800,这个小端位置的互换是指单个数据前后换,
而不是a[0],a[1]也要换,如果a[1],a[0]也要换那就是38003900,我这么理解是对的吗?
如果小端是39003800,以long输出的话,从后往前读取就是00380039,省略0就是380039;以char输出取最前面的十六进制39两位,对应字符9,
我这段话这么理解有错吗,麻烦请指点下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-22 19:40:04 | 显示全部楼层
sunrise085 发表于 2020-3-22 00:28
首先要知道以下三点:
1、机器一般都是小端存储,
2、int占4个字节,long占8个字节,char占1个字节

不对吧,我感觉这个题的int应该是2个字节的,哪有long是8个字节的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-22 20:25:07 | 显示全部楼层
张世来4610484 发表于 2020-3-22 19:40
不对吧,我感觉这个题的int应该是2个字节的,哪有long是8个字节的

1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-22 20:29:34 | 显示全部楼层
本帖最后由 time1970 于 2020-3-22 20:38 编辑
张世来4610484 发表于 2020-3-22 19:36
不懂大端小端,刚才搜了下,是这样理解的,这个题int 占两个字节,long占4个字节,char 占1个字节;
...


对的,要明白,计算机中数据的存储都是通过内存地址,没有所谓的前后,你只要按照地址去理解就好
举个例子,内存地址就好比房间号,每个房间只能放一个字节。
房间号小的放二进制的高位就是大端法存储方式
房间号小的放二进制的低位就是小端法存储方式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-22 20:47:05 | 显示全部楼层
张世来4610484 发表于 2020-3-22 19:40
不对吧,我感觉这个题的int应该是2个字节的,哪有long是8个字节的

嗯嗯你说的对。我昨晚想错了。现在修改过来了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-25 18:23:38 | 显示全部楼层
sunrise085 发表于 2020-3-22 00:28
首先要知道以下三点:
1、机器一般都是小端存储,
2、int占2个字节,long占4个字节,char占1个字节

我有新问题了,帮我看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-29 02:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表