张世来4610484 发表于 2020-3-22 00:11:07

共用体问题

题目一:输出下面的值
#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 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

sunrise085 发表于 2020-3-22 00:28:37

本帖最后由 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 19:36:23

本帖最后由 张世来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,
我这段话这么理解有错吗,麻烦请指点下。

张世来4610484 发表于 2020-3-22 19:40:04

sunrise085 发表于 2020-3-22 00:28
首先要知道以下三点:
1、机器一般都是小端存储,
2、int占4个字节,long占8个字节,char占1个字节


不对吧,我感觉这个题的int应该是2个字节的,哪有long是8个字节的

人造人 发表于 2020-3-22 20:25:07

张世来4610484 发表于 2020-3-22 19:40
不对吧,我感觉这个题的int应该是2个字节的,哪有long是8个字节的

time1970 发表于 2020-3-22 20:29:34

本帖最后由 time1970 于 2020-3-22 20:38 编辑

张世来4610484 发表于 2020-3-22 19:36
不懂大端小端,刚才搜了下,是这样理解的,这个题int 占两个字节,long占4个字节,char 占1个字节;
...

对的,要明白,计算机中数据的存储都是通过内存地址,没有所谓的前后,你只要按照地址去理解就好
举个例子,内存地址就好比房间号,每个房间只能放一个字节。
房间号小的放二进制的高位就是大端法存储方式
房间号小的放二进制的低位就是小端法存储方式

sunrise085 发表于 2020-3-22 20:47:05

张世来4610484 发表于 2020-3-22 19:40
不对吧,我感觉这个题的int应该是2个字节的,哪有long是8个字节的

嗯嗯你说的对。我昨晚想错了。现在修改过来了。

张世来4610484 发表于 2020-3-25 18:23:38

sunrise085 发表于 2020-3-22 00:28
首先要知道以下三点:
1、机器一般都是小端存储,
2、int占2个字节,long占4个字节,char占1个字节


我有新问题了,帮我看看
页: [1]
查看完整版本: 共用体问题